题意:有一个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;
}