#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int T;
int N;
const int maxn = 20;
const int ans = 1000000000;
int A[maxn][maxn], B[maxn][maxn];
int check(int i){
memset(B, 0, sizeof(B));
for(int c = 0; c < N; c++)
if( i & ( 1 << c)){
B[0][c] = 1;
}else{
if( A[0][c] == 1){
return ans;
}
}
for(int r = 0; r < N - 1; r++ )
for(int c = 0; c < N; c++){
int sum = 0;
/*up -> left -> right -> get below*/
if(r != 0){
sum += B[r - 1][c];
}
if(c != 0){
sum += B[r][c - 1];
}
if(c != N -1){
sum += B[r][c + 1];
}
int below = sum%2;
if(below == 0 && A[r + 1][c] == 1){
return ans;
}
B[r + 1][c] = below;
}
int ret = 0;
for(int r = 0; r != N; r++)
for(int c = 0; c != N; c++){
if( A[r][c] != B[r][c])
++ret;
}
return ret;
}
int main()
{
scanf("%d", &T);
for(int i = 0; i < T; i++){
scanf("%d", &N);
for(int r = 0; r < N; r++)
for(int c = 0; c < N; c++){
scanf("%d", &A[r][c]);
}
int ret = ans;
for(int j = 0; j < (1<<N); j++){
ret = min(ret , check(j)); /*get smallest */
}
if(ret == ans) ret = -1;
printf("Case %d: %d\n", i + 1, ret);
}
return 0;
}
uva 11464
最新推荐文章于 2017-10-13 20:35:08 发布