#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt=1e9+10;
int a[100010];
void dfs(int x,int y,int s[])
{
// if(x==n+1)puts("***");
//printf("%d %d\n",x,y);
int b[100010];
for(int i=1;i<=n*m;i++)b[i]=s[i];
if(x==(n+1)&&y==(m+1))
{
// puts("***");
int ans=0;
for(int i=1;i<=n*m;i++)ans+=(b[i]==1);
cnt=min(ans,cnt);
return ;
}
printf("%d %d\n",x,y);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)printf("%d",s[(i-1)*m+j]);
puts("");
}
puts("");
dfs(x+1,y+1,b);
for(int i=1;i<=n*m;i++)b[i]=s[i];
for(int i=1;i<=m;i++)b[(x-1)*m+i]=1-b[(x-1)*m+i];
dfs(x+1,y+1,b);
for(int i=1;i<=n*m;i++)b[i]=s[i];
for(int i=1;i<=n;i++)b[(i-1)*m+y]=1-b[(i-1)*m+y];
dfs(x+1,y+1,b);
for(int i=1;i<=n*m;i++)b[i]=s[i];
for(int i=1;i<=m;i++)b[(x-1)*m+i]=1-b[(x-1)*m+i];
for(int i=1;i<=n;i++)b[(i-1)*m+y]=1-b[(i-1)*m+y];
dfs(x+1,y+1,b);
return ;
}
int main()
{
scanf("%d%d",&n,&m);
char g[1001][1011];
for(int i=1;i<=n;i++)scanf("%s",g[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
a[(i-1)*m+j]=g[i][j]-'0';
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)printf("%d",a[(i-1)*m+j]);
// puts("");
// }
dfs(1,1,a);
printf("%d\n",cnt);
}
样例
10 10
0101001010
0110001011
1011001011
1011011001
0101101001
0111001011
1111010101
1111001100
0110011001
0011110100