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。