poj2386 DFS

来源:互联网 发布:linux cron命令每周三 编辑:程序博客网 时间:2024/06/08 13:08

深度优先搜索

核心的dfs程序就是每遇到一个W首先将它变为.然后扩展到周围8个位置坐标检验是否为W 若为W就继续搜索 直至周围都是. 算作一次dfs 最后统计dfs的次数

需要注意的是输入 可以直接输入字符串;或者按照字符输入,但要在每一行末尾接收一个回车

#include <stdio.h>

int N,M;

char field[200][200];

/*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;;

            if((0<=nx)&&(nx<N)&&(0<=ny)&&(ny<M)&&(field[nx][ny]=='W')){

                dfs(nx,ny);

            }

        }

    }

    return ;

}

int main()

{

    int count=0,i,j;

    scanf("%d%d",&N,&M);

        for(i=0;i<N;i++)

            scanf("%s",field[i]);

        for(i=0;i<N;i++){

            for(j=0;j<M;j++){

                if(field[i][j]=='W'){

                    dfs(i,j);

                    count++;

                }

            }

        }

        printf("%d\n",count);

    

    return 0;

}*/

void dfs(int x,int y){

    int nx,ny,dx,dy;

    field[x][y]='.';

    for(dx=-1;dx<=1;dx++){

        for(dy=-1;dy<=1;dy++){

            nx=x+dx;

            ny=y+dy;

            if(0 <= nx && nx <N && 0 <= ny && ny <M && field[nx][ny] =='W'){

                dfs(nx,ny);

            }

        }

    }

}

int main(){

    char ch;

    int i,j,ans =0;

    scanf("%d%d",&N,&M);

    for(i=0;i<N;i++){

        for(j=0;j<M;j++){

        scanf("%c",&field[i][j]);

        }

        scanf("%c",&ch);

    }

    for(i=0;i<N;i++){

        for(j=0;j<M;j++){

            if(field[i][j]=='W'){

                dfs(i,j);

                ans++;

            }

        }

    }

    printf("%d",ans);

}