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; }