前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lake Counting (POJ No.2386)

Lake Counting (POJ No.2386)

作者头像
杨鹏伟
发布2020-09-14 11:26:25
2640
发布2020-09-14 11:26:25
举报
文章被收录于专栏:ypwypw

题意:有一个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;
} 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档