解题思路
用dfs枚举每一行翻不翻,然后枚举每一列需不需要翻,然后取最优的就可以了。。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,lyx,minn,a[30][30];
char x;
void dfs(int dep,int ans){
if(dep>n)
{
int maxn=0,l=ans;
for(int j=1;j<=m;j++)
{
int sum=0;
for(int i=1;i<=n;i++)
sum+=a[i][j];
if(n-sum<sum) sum=n-sum,l++;
maxn+=sum;
}
minn=min(minn,maxn);
if(!maxn) lyx=min(l,lyx);
return;
}
for(int i=1;i<=m;i++)
a[dep][i]=(a[dep][i]+1)%2;
dfs(dep+1,ans+1);
for(int i=1;i<=m;i++)
a[dep][i]=(a[dep][i]+1)%2;
dfs(dep+1,ans);
}
int main(){
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>x;
a[i][j]=x-'0';
}
}
lyx=2147483600;
minn=lyx;
dfs(1,0);
if(!minn)
printf("%d",lyx);
else printf("%d",minn);
}