P32: 积水计数
“递归”是实现深度优先搜索的最好的方式。定义好规则然后就这样递归的循环下去直到走到终点
来自 <https://zh.wikipedia.org/wiki/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2>
/* P32: 积水计数 核心:1块积水是连在一起的,所以可以在找到一个点是积水时,可以用深度优先搜索将他周围所有是积水的点 都找出来,之所以用深度优先搜索是因为这样实现起来比较方便,定义好规则后直接递归即可。最后深度优先 搜索结束时就找到了一块积水。深度优先搜索的次数就是积水块的块数。 运行结果: ************************************************************************************* 10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W. 3 **************************************************************************************** */ #include <iostream> #include <iterator> #include <vector> using namespace std; const int MAX = 1010; int N, M; char field[MAX][MAX]; void dfs(int i, int j) { int dx[] = {-1, 0, 1}; int dy[] = {-1, 0, 1}; field[i][j] = '.'; for (int i2 = 0; i2 < 3; i2++) for (int j2 = 0; j2 < 3; j2++) { int nx = i + dx[i2]; int ny = j + dy[j2]; //下一个结点没出边界且依然是‘W’时继续进行深度优先搜索 if(nx >= 0 && nx < N && ny >= 0 && ny < M && field[nx][ny] == 'W') dfs(nx, ny); } } int main(void) { int count_dfs = 0; cin >> N >> M; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) cin >> field[i][j]; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { if (field[i][j] == 'W') { dfs(i, j); count_dfs++; } } cout << count_dfs; }