#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define inf 1000000007
using namespace std;
int n,m,g[101][101],h[10001],cnt=1,ans,dis[10001];
struct Edge{
int next,to,c;
}e[100001];
void add(int u,int v,int w)
{
cnt++;
e[cnt].next=h[u];
h[u]=cnt;
e[cnt].to=v;
e[cnt].c=w;
}
bool bfs()
{
queue<int> q;
memset(dis,0,sizeof(dis));
dis[0]=1;
q.push(0);
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=h[now];i!=0;i=e[i].next)
if(dis[e[i].to]==0&&e[i].c>0)
{
dis[e[i].to]=dis[now]+1;
q.push(e[i].to);
}
}
return dis[n*m+1]!=0;
}
int dfs(int k,int mn)
{
if(k==n*m+1)
return mn;
int num=0;
for(int i=h[k];i!=0;i=e[i].next)
{
if(dis[e[i].to]==dis[k]+1&&e[i].c>=1&&num<mn)
{
int F=dfs(e[i].to,min(e[i].c,mn-num));
num+=F;
e[i].c-=F;
e[i^1].c+=F;
}
}
return num;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1,x;j<=m;j++)
{
cin>>x;
if(i!=1)
{
add((i-1)*m+j,(i-1)*m+j-m,1);
add((i-1)*m+j-m,(i-1)*m+j,-1);
}
if(i!=n)
{
add((i-1)*m+j,(i-1)*m+j+m,1);
add((i-1)*m+j+m,(i-1)*m+j,-1);
}
if(j!=1)
{
add((i-1)*m+j,(i-1)*m+j-1,1);
add((i-1)*m+j-1,(i-1)*m+j,-1);
}
if(j!=m)
{
add((i-1)*m+j,(i-1)*m+j+1,1);
add((i-1)*m+j-1,(i-1)*m+j,-1);
}
if(x==1)
{
add(0,(i-1)*m+j,inf);
add((i-1)*m+j,0,0);
}
if(x==2)
{
add((i-1)*m+j,n*m+1,inf);
add(n*m+1,(i-1)*m+j,0);
}
}
while(bfs())
ans+=dfs(0,inf);
cout<<ans;
return 0;
}