DFS的核心就是从一种状态出发,转向任意的一个可行状态,直到达到结束条件为止。
洛谷 P1596 [USACO10OCT] 湖计数Lake Counting
DFS入门题,求连通块的。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int dx[8]={-1,-1,-1, 0, 0, 1,1,1};//方向 5 int dy[8]={-1, 0, 1,-1, 1,-1,0,1}; 6 char mapp[110][110];//地图 7 int n,m; 8 9 void dfs (int x,int y) 10 { 11 int nx,ny; 12 mapp[x][y]=‘.‘;//每进入一个状态就把这个点去掉,避免重复进入DFS 13 for (int i=0;i<8;i++) 14 { 15 nx=x+dx[i]; 16 ny=y+dy[i]; 17 if (nx<0||nx>=n||ny<0||ny>=m) 18 continue; 19 if (mapp[nx][ny]==‘W‘)//如果‘.’也能走的话,那整块图都可以走了... 20 dfs(nx,ny);//进入到下一个状态 21 } 22 return ; 23 } 24 25 int main() 26 { 27 scanf("%d %d",&n,&m); 28 int fin=0; 29 for (int i=0;i<n;i++) 30 scanf("%s",mapp[i]);//这样读一行 31 for (int i=0;i<n;i++) 32 { 33 for (int j=0;j<m;j++) 34 { 35 if (mapp[i][j]==‘W‘) 36 { 37 dfs(i,j);//每次DFS一遍后,整块湖泊就算填平了 38 fin++; 39 } 40 } 41 } 42 printf("%d\n",fin); 43 return 0; 44 }
原文:https://www.cnblogs.com/Salty-Fish/p/12253270.html