#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b) ((a)>(b)?a:b)
#define min(a,b) ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=1e5+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){ re int x=0,f=0;re char c=getchar(); while(!isdigit(c)) f|=(c=='-'),c=getchar(); while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=getchar(); return f?-x:x;}
in void write(re int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}
int xx[]={1,0,-1,0};
int yy[]={0,1,0,-1};
int a[1011][1111];
int n,m;
struct edge{
int u,v,w;
int nx;
}e[M];
int tot,head[N],cur[N];
in void add(re int u,re int v,re int w){
e[tot].u=u;
e[tot].v=v;
e[tot].w=w;
e[tot].nx=head[u];
head[u]=tot++;
}
int dep[N];
int s,t;
int num(int i,int j){
return ((i-1)*m+j);
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;
dep[s]=1;
q.push(s);
cur[s]=head[s];
while(!q.empty()){
int u=q.front();
q.pop();
for(re int i=head[u];~i;i=e[i].nx){
int v=e[i].v;
cur[v]=head[v];
// debug;
if(dep[v]==0&&e[i].w>0){
dep[v]=dep[u]+1;
if(v==t) return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int u,int lim){
int flow=0;
if(u==t) return lim;
for(int i=cur[u];~i;i=e[i].nx){
int v=e[i].v;
cur[u]=i;
debug;
if(dep[v]==dep[u]+1&&e[i].w>0){
int minf=dfs(v,min(e[i].w,lim));
if(minf){
lim-=minf;
flow+=minf;
e[i].w-=minf;
e[i^1].w+=minf;
if(lim==0) return flow;
}
}
}
return flow;
}
int dinic(){
int ans=0;
// debug;
while(bfs()){
ans+=dfs(s,INF);
}
return ans;
}
signed main(){
memset(head,-1,sizeof(head));
n=read();m=read();
s=n*m+1,t=n*m+2;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=read();
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1){
add(s,num(i,j),INF);
add(num(i,j),s,0);
}
if(a[i][j]==2){
add(num(i,j),t,INF);
add(t,num(i,j),0);
}
}
}
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++){
for(int i=0;i<4;i++){
if(dx<=n&&dy<=m&&dx>=1&&dy>=1){
add(num(x,y),num(dx,dy),1);
add(num(dx,dy),num(x,y),0);
add(num(x,y),num(dx,dy),0);
add(num(dx,dy),num(x,y),1);
}
}
}
}
cout<<dinic()<<endl;
return 0;
}