#include <iostream>#include <cstring>#include <cstdio>using namespace std;int n,m;int map[15][15];int status[2100];int dp[15][2100];int getnum(int i){ int s=0; while (i>0) { if (i&1) s++; i>>=1; } return s;}int getss(int i,int t){ if (t==0) return 0; int s=(1<<t); s=(s&i); if (s>0) s=1; else s=0; return s;}int main(){ while (cin>>n>>m) { for (int i=1;i<=n;i++) for (int t=1;t<=m;t++) cin>>map[i][t]; memset(dp,-1,sizeof(dp)); int cnt=(1<<(n+1)); for (int i=0;i<cnt;i++) { int s=0; dp[0][i]=getnum(i); } for (int i=1;i<=m;i++) { for (int t=0;t<cnt;t++) { if (dp[i-1][t]==-1) continue ; for (int k=0;k<cnt;k++) { int p=1; for (int j=1;j<=n;j++) { int s=getss(t,j-1)+getss(t,j)+getss(t,j+1)+getss(k,j-1)+getss(k,j)+getss(k,j+1); if (s!=map[j][i]) { p=0; break; } } if (p) { if (dp[i][k]==-1) dp[i][k]=dp[i-1][t]+getnum(k); else dp[i][k]=min(dp[i][k],dp[i-1][t]+getnum(k)); } } } } int ans=0x3f3f3f3f; for (int i=0;i<cnt;i++) { if (dp[m][i]!=-1) ans=min(ans,dp[m][i]); } cout<<ans<<endl; }}