#include <bits/stdc++.h>
using namespace std;
char mz[10][10],tmpmz[10][10];
int cal1(int x)
{
int ret=0;
while(x)
{
if(x&1)
ret++;
x>>=1;
}
return ret;
}
int main()
{
int i,j,n,m,rowsum,colsum,rsta,csta,now,ans,flag,sum;
while(cin>>rowsum>>colsum>>n)
{
for(i=0;i<n;i++)
scanf(" %s",mz[i]);
m=strlen(mz[0]);
ans=1<<29;
for(rsta=0;rsta<(1<<n);rsta++)
{
if(cal1(rsta)!=rowsum)
continue;
for(csta=0;csta<(1<<m);csta++)
{
if(cal1(csta)!=colsum)
continue;
now=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
tmpmz[i][j]=mz[i][j];
for(i=0;i<n;i++)
{
if(!(rsta&(1<<i)))
continue;
for(j=0;j<m;j++)
{
if((m&1)&&(m/2==j))
continue;
if((n&1)&&(n/2==i))
{
sum=tmpmz[i][j]+tmpmz[i][m-j-1]-2*'0';
now+=min(sum,2-sum);
tmpmz[i][j]=tmpmz[i][m-j-1];
continue;
}
flag=0;
if(rsta&(1<<(n-i-1)))
flag++;
if(csta&(1<<j))
flag++;
if(csta&(1<<(m-j-1)))
flag++;
if(flag>=2)
{
sum=tmpmz[i][j]+tmpmz[i][m-j-1]+tmpmz[n-i-1][j]+tmpmz[n-i-1][m-j-1]-'0'*4;
if(sum>=2)
{
tmpmz[i][j]='1';
tmpmz[i][m-j-1]='1';
tmpmz[n-i-1][j]='1';
tmpmz[n-i-1][m-j-1]='1';
now+=4-sum;
}
else
{
tmpmz[i][j]='0';
tmpmz[i][m-j-1]='0';
tmpmz[n-i-1][j]='0';
tmpmz[n-i-1][m-j-1]='0';
now+=sum;
}
}
else
{
if(csta&(1<<j))
{
sum=tmpmz[i][j]+tmpmz[i][m-j-1]+tmpmz[n-i-1][j]-'0'*3;
if(sum>=2)
{
tmpmz[i][j]='1';
tmpmz[i][m-j-1]='1';
tmpmz[n-i-1][j]='1';
now+=3-sum;
}
else
{
tmpmz[i][j]='0';
tmpmz[i][m-j-1]='0';
tmpmz[n-i-1][j]='0';
now+=sum;
}
}
else if(csta&(1<<(m-j-1)))
{
sum=tmpmz[i][j]+tmpmz[i][m-j-1]+tmpmz[n-i-1][m-j-1]-'0'*3;
if(sum>=2)
{
tmpmz[i][j]='1';
tmpmz[i][m-j-1]='1';
tmpmz[n-i-1][m-j-1]='1';
now+=3-sum;
}
else
{
tmpmz[i][j]='0';
tmpmz[i][m-j-1]='0';
tmpmz[n-i-1][m-j-1]='0';
now+=sum;
}
}
else
{
sum=tmpmz[i][j]+tmpmz[i][m-j-1]-2*'0';
now+=min(sum,2-sum);
tmpmz[i][j]=tmpmz[i][m-j-1];
}
}
}
}
for(j=0;j<m;j++)
{
if(!(csta&(1<<j)))
continue;
for(i=0;i<n;i++)
{
if(tmpmz[i][j]!=tmpmz[n-i-1][j])
{
tmpmz[i][j]=tmpmz[n-i-1][j];
now++;
}
}
}
ans=min(ans,now);
}
}
printf("%d\n",ans);
}
}
51nod 1316 回文矩阵
最新推荐文章于 2023-10-26 18:31:19 发布