#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0;
char c[505][505];
int fx[4]={-1,0,1,0};
int fy[4]={0,1,0,-1};
struct node{
int x,y;
};
queue<node> q;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if((i==1||i==n||j==1||j==m)&&c[i][j]=='0'){//在区域周围且能淹没
q.push({i,j});
c[i][j]='*';//淹没后默认为墙
}
}
while(!q.empty()){//直至全部淹没停止
int x=q.front().x;
int y=q.front().y;
for(int i=0;i<=3;i++){
int tx=x+fx[i],ty=y+fy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&c[tx][ty]=='0'){
q.push({tx,ty});
c[tx][ty]='*';//淹没后默认为墙
}
}
q.pop();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(c[i][j]=='0') ans++;
}
}
cout<<ans;
return 0;
}
/**************************************************************
Problem: 1913
User: fuhongyi
Language: C++
Result: Accepted
Time:29 ms
Memory:2328 kb
****************************************************************/