题目:
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 的网格图表示。每个网格中有水(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;
}