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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值