Lake Counting積水問題dfs深さ探索

9046 ワード

原題リンク:Lake Counting
深度優先検索
任意wから、隣接部分を全て用いる.代わりに.一度のDFSは、このwと初期に接続されたすべてのwを'.'に置き換えることができ、ウサギが存在しないwまでの合計回数であるDFSの回数,すなわち原題の池の数である.複雑度はO(8 NM)=O(M*N)である.
#include 
#include
using namespace std;
#define maxn 105
char field[maxn][maxn];
int n,m;
void dfs(int x,int y)
{
    field[x][y]='.';
    //        
    for(int dx=-1;dx<=1;dx++){
        for(int dy=-1;dy<=1;dy++){
            int nx=x+dx,ny=y+dy;
            //  (nx,ny)      ,       
            if(0<=nx&&nx<n&&0<=ny&&ny<m&&field[nx][ny]=='W'){
                dfs(nx,ny);
            }
        }
    }
}
void solve()
{
    int res=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(field[i][j]=='W'){
                //           
                dfs(i,j);
                res++;
            }
        }
    }
    printf("%d
"
,res); } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>field[i][j]; } } solve(); return 0; }