POJ 2386 dfs求连通块

题目:

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑

题解

这道题可以看作一个求联通块的一个问题,那么自然而然可以想到用dfs来求最大的联通块。

全图dfs,走到一个W后就用’代替W,走遍全图,直到没用W。

时间复杂度

全图每个点dfs O(N*M*8)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
using namespace std;
#define rall(x) (x).rbegin(), (x).rend()
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define sz(a) (int) (a).size()
#define endl "\n"
char g[110][110];
int n,m;
void dfs(int a,int b){
	if(g[a][b]=='W') g[a][b]='.';
	for(int i=-1;i<=1;i++){
	   for(int j=-1;j<=1;j++){
	   	int dx=a+i,dy=b+j;
	   	if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&g[dx][dy]=='W') dfs(dx,dy);
	   }
	}
   return ;
	
}
void solved() {
cin>>n>>m;
for(int i=1;i<=n;i++){
	for(int j=1;j<=m;j++) cin>>g[i][j];
}
int res=0;
for(int i=1;i<=n;i++){
	for(int j=1;j<=m;j++){
		if(g[i][j]=='W') dfs(i,j),res++;
		
	}
}
cout<<res<<endl;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	solved();

	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值