DFS之草坪找人

 

 

 

 

#include<cstdio>
#include<string>
using namespace std;
int n,m,cnt; //分别为地图规模,和需要多少人 
char map[105][105]; //存储地图值 
bool vis[105][105]; //存储是否走过 
void dfs(int x,int y){
    if(x<0||x>=n||y<0||y>=m||map[x][y]=='.'||vis[x][y]){
        return;
    }//边界判断,递归的出口 
    vis[x][y]=true;//满足条件可以走,标记1 
    dfs(x+1,y);
    dfs(x-1,y);
    dfs(x,y+1);
    dfs(x,y-1);
    //向其相邻周边探索,是就标记 
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",map[i]);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(!vis[i][j]&&map[i][j]=='#'){
                dfs(i,j);
                cnt++;
            }
        }
    }//逐个点判断 
    printf("%d\n",cnt);
    return 0;
}

思想:用DFS都找一遍,遍历整个地图然后每个点用dfs去找,找到草坪就标记,在遍历整个地图的时候若当前点是前一个点的相邻点,因为在前一个点的dfs搜索中已经标记了当前点,所以在当前点的条件判断中不会进入当前点的dfs。

posted on 2020-03-11 14:43  二进制dd  阅读(180)  评论(0编辑  收藏  举报

导航