/*这是对我上一个做法的改进,在输入矩阵时直接把外层空地入队列,之后直接bfs即可,不需要再遍历外层,简化了代码*/
#include <iostream>
#include <queue>
using namespace std;
 
int main() {
    //kd记录空地总数
    int kd = 0;
    //ym记录被淹没的空地数量
    int ym = 0;
    //bfs所用队列
    queue<pair<int, int>> q;
    //输入数据
    int x, y;
    cin >> x >> y;
    char mp[x][y];
    for(int i = 0; i < x; i++){
        for(int j = 0; j < y; j++){
            cin >> mp[i][j];
            if(mp[i][j] == '0'){
                kd++;//使用kd记录空地总数
                if(i == 0 || i == x - 1 || j == 0 || j == y - 1){
                    mp[i][j] = ',';
                    q.push({i, j});
                    ym++;
                }
            }
        }
    }
    //辅助数组
    int xx[4] = {-1, 1, 0, 0};
    int yy[4] = {0, 0, -1, 1};

    //bfs算法从边界开始搜索所有淹没的格子并做标记
    while(!q.empty()){
        pair<int, int> current = q.front();
        q.pop();
        for(int i = 0; i < 4; i++){
            int xc = current.first + xx[i];
            int yc = current.second + yy[i];
            if(xc >= 0 && xc < x && yc >= 0 && yc < y && mp[xc][yc] == '0'){
                mp[xc][yc] = ',';
                q.push({xc, yc});
                ym++;
            }
        }
    }
 
    //计算并输出结果
    int res = kd - ym;
    cout << res << endl;
    return 0;
}
// 64 位输出请用 printf("%lld")