I_四面楚歌
这道题我用的搜索可能和大部分人不一样QAQ
我是把要输入的区域放在 [1,n][1,m] 上,再在0行、0列、(n+1) 行、(m+1) 列搞空地 '.'
最后在(0,0)位置放个 '1' 然后让他四个方向扩散开。
遇到空地或者 '0' 就压过去,最后搜索 '0' 就行啦
放AC代码
#include<bits/stdc++.h>
using namespace std;
char war[1005][1005];//地图
int n,m,ans;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};//四个方向
void dfs(int x,int y){
war[x][y]='1';//扩散
for(int i=0;i<4;i++)
if((x+dx[i]>=0&&y+dy[i]>=0&&x+dx[i]<=n&&y+dy[i]<=m)&&(war[x+dx[i]][y+dy[i]]=='.'||war[x+dx[i]][y+dy[i]]=='0')) dfs(x+dx[i],y+dy[i]);
//注意目标不能超过地图最大范围
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){//都从1开始录
cin>>war[i][j];
if(war[i][j]=='0') ans++;//0的个数
}
n++;
m++;//扩大地图
for(int i=0;i<=n;i++){
war[i][0]='.';
war[i][m]='.';
}
for(int i=0;i<=m;i++){
war[0][i]='.';
war[n][i]='.';
}
//搞空地
dfs(0,0);
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
if(war[i][j]=='0') ans--;//减去存活的0
cout<<ans;
return 0;
}
京公网安备 11010502036488号