这道题很纯粹的dfs;题意:就是求有多少个水洼,一个水洼根据常识都应该知道是四面换地的;所以每次dfs改一遍能连通的w;改变次数就是ans了;
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
char maze[200][200];
int book[200][200];
int dir[][2]={{-1,0},//上
{-1,1},//右上
{0,1},//右
{1,1},//右下
{1,0},//下
{1,-1},//左下
{0,-1},//左
{-1,-1}//左上
} ;
void dfs(int x,int y){
maze[x][y]='.';
for(int i=0;i<8;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx<n&&nx>=0&&ny<m&&ny>=0&&!book[nx][ny]&&maze[nx][ny]=='W'){//注意这里的边界判断+标记
book[nx][ny]=1;
dfs(nx,ny);
book[nx][ny]=0;
}
}
}
void init(){
scanf("%lld %lld",&n,&m);
for(int i=0;i<n;i++){
cin>>maze[i];
}
}
int main(){
init();
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(maze[i][j]=='W'){
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
return 0;
}