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
