2019/01/19更新 学完书后重新写了一遍 感觉结构更清晰
#include<iostream>
#include<cstring>
using namespace std;
char a[105][105];
int w,h;
int ans;
bool check(int i,int j){//隐约束(是否有可行解或最优解的约束)
if(i<0||i>=h||j<0||j>=w||a[i][j]=='.')return false;
else return true;
}
void dfs(int i,int j){
if(check(i,j)){
a[i][j]='.';
dfs(i-1,j-1);dfs(i-1,j);dfs(i-1,j+1);
dfs(i,j-1);dfs(i,j+1);
dfs(i+1,j-1);dfs(i+1,j);dfs(i+1,j+1);
}
}
int main(){
scanf("%d%d",&h,&w);
for(int i=0;i<h;++i)
scanf("%s",a[i]);
for(int i=0;i<h;++i){
for(int j=0;j<w;++j){
if(a[i][j]=='W') {
ans++;
dfs(i,j);
}
}
}
printf("%d\n",ans);
}
我终于开始做DFS的题目了,一直很畏惧,但真正做起来也没那么难......真是服了我自己,居然那么胆小
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char a[105][105];
void dfs(int x,int y){//遍历8个方向
for(int dx=-1;dx<=1;dx++)
for(int dy=-1;dy<=1;dy++){
int nx=x+dx;
int ny=y+dy;
//判断(nx,ny)是否在园子内且有积水
if(nx>=0&&nx<n&&ny>=0&&ny<m&&a[nx][ny]=='W'){
a[nx][ny]='.';
dfs(nx,ny);
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;++i)
scanf("%s",a[i]);
int num=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]=='W'){
dfs(i,j);
num++;
}
printf("%d\n",num);
return 0;
}