Poj 2386 Lake Counting

这道题的大意是让你计算水池的数量,实际上是一个简单的搜索题目,运用深度优先搜索算法即可解决。

对于题目给的这个水池:

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 
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;
}



你可能感兴趣的:(搜索,算法)