这道题的大意是让你计算水池的数量,实际上是一个简单的搜索题目,运用深度优先搜索算法即可解决。
对于题目给的这个水池:
W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W.(1)我们先循环遍历大地图,当搜索到一个‘W’的时候,即可以开始进行搜索算法了,此时,我们首先搜索到了第一个‘W’
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
(2)从这个'W'处开始搜索算法,找寻周围的8个方向,注意得把已经搜到的'W'变为'*',搜到的‘.’不做处理,当遇到‘W’时停止。当然,超过地图的方向,我们是排除的
.........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W.(3)将搜索到的'w'踏平,变为'.',在此次搜寻到的‘W’处继续搜索'W'
.........WW. ..WW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W.
(4)重复上边的步骤,直到无法搜索到‘W’则停止递归,此时则完成了一个水池的处理,不要忘记把水池数目加1.
在此贴上代码:
#include <iostream>
using namespace std;
const int M = 102;
const int N = 102;
char a[N][M];
int n, m;
int nextn[8][2] = { 1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1 };//方向数组
void dfs(int, int);
int main()
{
while (cin >> n >> m)
{
int num = 0;
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> a[i][j];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
if (a[i][j] == 'W')
{
dfs(i, j);
num++;
}
}
}
cout << num << endl;
//system("pause");
}
}
void dfs(int x, int y)
{
a[x][y] = '.';
int dx, dy;
int i;
for (i = 0; i < 8; i++)
{
dx = x + nextn[i][0];
dy = y + nextn[i][1];
if (dx >= 1 && dx <= n&&dy >= 1 && dy <= m&&a[dx][dy] == 'W')
{
dfs(dx, dy);
}
}
return;
}