poj1562-DFS

如果想在DFS过程中计算油田个数会很麻烦,所以要简化思想。我们可以把每一个油田当成一次DFS(只对"@"的进行DFS,这样每当DFS退出时,表示一块油田搜索完毕 ),这样每次DFS后油田数加一,最后输出结果。

#include<stdio.h>
#include<string.h>
char map[101][101];
int oil;
int m,n;
bool book[101][101];
int next[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};       //存储8个方向
bool iforder(int x,int y){                                //判断是否越界
    if(x<0||x>=m||y<0||y>=n)  
    return true;  
    return false;  
}
void dfs(int x,int y){
    if(map[x][y]=='*')                                   //跳过“*”
        return;
    for(int i=0;i<8;i++){
        int tx=x+next[i][0];
        int ty=y+next[i][1];
        if(iforder(tx,ty)||book[tx][ty])                        //跳过已经搜索过或者越界的
            continue;
        book[tx][ty]=1;
        if(map[tx][ty]=='@')
            dfs(tx,ty);
    }
}
int main(){
    scanf("%d %d",&m,&n);
    while(m!=0&&n!=0){
        for(int i=0;i<m;i++)
            scanf("%s",&map[i]);
        memset(book,0,sizeof(book));
        oil=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(!book[i][j]&&map[i][j]!='*')    {
                    dfs(i,j);
                    oil++;                                //每次DFS后油田数+1
                }
            }
        printf("%d\n",oil);
        scanf("%d %d",&m,&n);
    }
}

 

posted @ 2017-03-21 10:58  Mr.Struggle  阅读(165)  评论(0编辑  收藏  举报