#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main(){
    int x, y;
    cin >> x >> y;
    char c[x+2][y+2];
    for(int i = 0; i < y+1; i++)
        c[0][i] = '-', c[x+1][i] = '-';
    for(int i = 0; i < x + 1; i++)
        c[i][0] = '-', c[i][y+1] = '-';
    for(int i = 1; i <= x; i++){
        for(int j = 1; j <= y; j++){
            cin >> c[i][j];
        }
    }
    for(int i = 1; i <= x; i++){
        for(int j = 1; j <= y; j++){
            int a = i, b = j;

            bool f = false;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';

            f = false;
            a = x + 1 - i, b = j;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';

            f = false;
            a = i, b = y + 1 - j;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';

            f = false;
            a = x + 1 - i, b = y + 1 - j;
            if(c[a][b] == '0'){
                c[a-1][b] == '-'?f = true:f = f;
                c[a][b+1] == '-'?f = true:f = f;
                c[a+1][b] == '-'?f = true:f = f;
                c[a][b-1] == '-'?f = true:f = f;
            }
            if(f) c[a][b] = '-';
        }
    }
    int ans = 0;
    for(int i = 1; i <= x; i++){
        for(int j = 1; j <= y; j++){
            int f = 0;
            int a = i, b = j;
            if(c[a][b] == '0'){
                ans++;
            }
        }
       // cout << endl;
    }
    cout << ans;
}

先标记上下左右边界为'-',然后再做四次遍历

第一次:从左到右,从上到下。

第二次:从左到右,从下到上。

第三次:从右到左,从上到下。

第四次:从右到左,从下到上。

如果当前元素值为'0',那就比较上下左右是否与外界连通(即上下左右是否为'-'),如果存在至少一个为'-',就标记该元素值为'-',

然后四次遍历足够将所有与外界连通的'0',变为'-'。

这四次遍历可以用一次双循环就行。

然后再计算剩下的'0'的数量就行。