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