题目描述
有一片区域, W W W 表示水, . . . 表示陆地。
现在要求出这里面有多少联通的水坑(八个方向)。
解析
这题我们可以用 D F S DFS DFS 做。
首先我们在这片区域里面找,然后如果发现了一个水,就往不同方向拓展。
外面得是水,还得没访问过,所以用一个bool数组来判断那个地方是否被访问过。判断即:
a[nx][ny]=="W"&&!vis[nx][ny]
找完了答案就加一,这道题就迎刃而解了。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0;
char a[101][101];
bool vis[101][101];
int dx[8]={0,1,0,-1,1,1,-1,-1};
int dy[8]={1,0,-1,0,1,-1,1,-1};
void eee(int x,int y){
vis[x][y]=true;//这个位置到了就走过了
for(int i=0;i<8;i++){
int nx=x+dx[i];//x位置
int ny=y+dy[i];//y位置
if(a[nx][ny]=='W'&&!vis[nx][ny]){//如果水相连且没走过
eee(nx,ny);//下一个
}
}
return ;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='W'&&!vis[i][j]){
eee(i,j);//搜索
ans++;//找完了,答案加一
}
}
}
cout<<ans<<endl;
return 0;
}