题目
https://www.luogu.com.cn/problem/P1596
思路
洛谷的这个题和Uva 572油田是一样的,只需要改一下符号就行了。这是一个经典的使用DFS寻找连通的块的问题。这里使用的8方向枚举不用建立数组,代码简洁,mark
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100 + 10;
char G[maxn][maxn];
int n,m;
int vis[maxn][maxn];
void dfs(int x,int y,int id){
if(x<0 || x>=n || y<0 || y>=m)return;
if(vis[x][y]>0 || G[x][y] != 'W')return;
vis[x][y] = id;
//8方向枚举
for(int dx=-1;dx<=1;dx++){
for(int dy=-1;dy<=1;dy++){
//dx 和 dy不能同时为0
if(dx !=0 || dy != 0)dfs(x+dx, y+dy, id);
}
}
}
int main(){
scanf("%d %d", &n, &m);
for(int i=0;i<n;i++)scanf("%s",G[i]);
int ans = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(G[i][j] == 'W' && !vis[i][j]){
dfs(i ,j, ++ans);
}
}
}
cout<<ans<<endl;
return 0;
}