原题地址:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24665
代码:
#include "stdio.h"
#include "string.h"
#include "iostream"
using namespace std;
int a[17][17],ans,inf=1000000,n,b[17][17];
void input()
{
memset(b,0,sizeof(b));
ans=inf;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
}
int get_ans()
{
int temp=0;
for(int i=1;i<=n;i++)
if(a[1][i]!=b[1][i])
temp++;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
b[i][j]=b[i-1][j-1]^b[i-1][j+1]^b[i-2][j];
if(b[i][j]==1)
{
if(a[i][j]==0)
{
temp++;
}
}
else if(a[i][j]==1)
{
temp=inf;
return temp;
}
}
}
return temp;
}
void cheak(int x,int i)
{
if(x==0)
cheak(1,i);
b[1][i]=x;
if(i==n)
{
ans=min(ans,get_ans());
return;
}
cheak(a[1][i+1],i+1);
}
void solve()
{
cheak(a[1][1],1);
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
input();
printf("Case %d: ",i);
solve();
}
return 0;
}