#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;
}
深度优先搜索:Lake Counting (POJ No.2386)
猜你喜欢
转载自blog.csdn.net/chongzi_daima/article/details/104095472
今日推荐
周排行