Lake Counting (POJ No.2386)

时间:2022-07-24
本文章向大家介绍Lake Counting (POJ No.2386),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题意:有一个M*N的圈子,雨后有积水,然后八个方位相联通的被认为是连接在一起的。请求出圈子里共有多少个水洼。

思路:这个题目我们很明显可以用并查集来做,但是这个章节是属于DFS,所以我们用DFS来考虑,从任意的W开始,不停的把临接的部分用"."代替。一次DFS后与初始的这个W连接的所有W都被替代转换成“.”。因此直到图中不再存在W为止。总共进行DFS的次数就是答案了。8个方向共对应了8种状态转移,每个格子作为DFS的参数至多被调用一次,所以复杂度为(8 ^ M ^ N)。

#include<bits/stdc++.h>
#define maxn 100003
using namespace std;

char a[maxn][maxn];



void dfs(int x,int y){
     a[x][y] = '.';
	 
	 for(int dx=-1,dx<=1;dx++){
	 	for(int dy=-1;dy<=1;dy++){
	 		int nx = x+dy,ny = y+dy;
	 		if(nx>=1 && nx<=n && ny>=1 && ny<=m && a[nx][ny] == 'W') dfs(nx,ny);
		 }
	 }
	 return ;	
}

void solve(){
	int res = 0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j] == 'W'){
				dfs(i,j);
				res++;
			}
		}
	}
	cout<<res<<endl;
}


int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	
	solve();
	
	return 0;
}