题意思路参考《训练指南》
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;i++)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=50;
int t,n,matrix[maxn][maxn],temp[maxn][maxn],ans,sum,cnt;
int dy[]={1,-1,0};
int dx[]={0,0,-1};
bool OK(int x,int y){
if(x>=0&&x<n&&y>=0&&y<n) return true;
return false;
}
int solve(int s){
cnt=0;
memset(temp,0,sizeof(temp));
for(int k=0;k<n;k++)
if(s&(1<<k)) temp[0][k]=1;///初始化第一行
else if(matrix[0][k]==1) return inf;
rep(i,n)rep(j,n){
sum=0;
rep(k,3){
int xx=i+dx[k];
int yy=j+dy[k];
if(OK(xx,yy)){
sum+=temp[xx][yy];
}
}
if(!(sum%2)&&matrix[i+1][j]) return inf;
if(sum%2&&i==n-1) return inf;
else if(sum%2) temp[i+1][j]=1;///最后一行需要特判
}
rep(i,n) rep(j,n) if(temp[i][j]!=matrix[i][j]) cnt++;
return cnt;
}
int main(){
while(scanf("%d",&t)!=EOF){
for(int cas=1;cas<=t;cas++){
memset(matrix,0,sizeof(matrix));
ans=inf;
scanf("%d",&n);
rep(i,n)rep(j,n) scanf("%d",&matrix[i][j]);
rep(i,1<<n){
ans=min(ans,solve(i));
}
if(ans==inf) ans=-1;
printf("Case %d: %d\n",cas,ans);
}
}
return 0;
}