Lake Counting (POJ No.2386)

2020-09-14 11:26:25 浏览数 (1)

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

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

代码语言:javascript复制
#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;
} 
dfs

0 人点赞