深度优先搜索:Lake Counting (POJ No.2386)

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
#define MAX_N 2147483647

/* Lake Counting(POJ No.2386)
 *  有一个大小为N*M的院子,雨后堆积了水,八连通的水认为是链接在一起的,请求出园子里总共有多少水洼?
 *  八连通(相对w的.的部分,如果w的八个方向有w连接的话,会认为两个w是连通的):
 *        ...
 *        .W.
 *        ...
 */


//dfs解决该问题
/*思路:
 *    dfs的过程为:将该dfs的水洼位置置位'.',表示该状态已经被到达,之后检测八连通位置是否有'w',有的话认为是连通的水洼,dfs该连通的'w'位置
 *    1.主过程:使用嵌套循环检测'w'位置,进行dfs该位置,这样与其连通的'w'位置都会被认为同一个水洼,最外层dfs结束的时候,'w'都会被置位'.',这时将计数器加1,证明检测到了一个连通的水洼
 *    2.之后再进行检测下一个'w'位置,。。。。。。直到最后没有'w'存在,将计数器输出即可。
 */


const int N=3,M=3;  //测试使用,可自行修改N M的值
char field[N][M];

void dfs(int posx,int posy)
{
	field[posx][posy]='.';
	for (int i = -1; i !=2 ; ++i) {
		for (int j = -1; j !=2; ++j) {
			int tempX=posx+i;
			int tempY=posy+j;
			if(tempX>=0 && tempY>=0 && tempX<M && tempY<N && field[tempX][tempY]=='w') dfs(tempX,tempY);
		}
	}
	return;
}

int main()
{

	for (int i = 0; i !=N; ++i) {
		for (int j = 0; j !=M; ++j) {
			cin>>field[i][j];
		}
	}

    int res=0;
	for (int i = 0; i !=N; ++i) {
		for (int j = 0; j !=M; ++j) {
			if(field[i][j]=='w')
			{
				dfs(i,j);
				++res;
			}

		}
	}

    cout<<res;
	return  0;
}

猜你喜欢

转载自blog.csdn.net/chongzi_daima/article/details/104095472
今日推荐