#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
const int INF = ~0U >> 1;
const int maxn = 20;
const int dx[] = {0, -1, 0, 1};
const int dy[] = {-1, 0, 1, 0};
int T, n, kase = 0;
int str[maxn][maxn], s[maxn][maxn];
void print() {
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j)
printf("%d ", s[i][j]);
printf("\n");
}
}
int slove(int ss) {
int ans = 0;
for(int i = 1; i <= n; ++i) {
if(ss & (1 << (i - 1))) {
if(str[1][i] == 0) {
s[1][i] = 1;
++ans;
}
} else {
if(str[1][i] == 1) return INF;
}
}
//printf("++++\n");
bool ok = true;
int nx, ny;
for(int i = 1; i < n; ++i) {
for(int j = 1; j <= n; ++j) {
int cnt = 0;
for(int k = 0; k < 3; ++k) {
nx = dx[k] + i, ny = dy[k] + j;
cnt += s[nx][ny];
}
nx = i + dx[3], ny = j + dy[3];
if(cnt == 1 || cnt == 3) { /// jishu
if(s[nx][ny] == 0) {
++ans;
s[nx][ny] = 1;
}
} else {
//if(ss == 0) printf("%d %d****%d %d****%d %d\n", i, j, dx[3], dy[3], nx, ny);
if(s[nx][ny] == 1) {
ok = false;
goto leap;
}
}
}
}
//if(ss == 0) print();
leap:
if(ok) return ans;
else return INF;
}
int main() {
scanf("%d", &T);
while(T--) {
memset(str, 0, sizeof(str));
memset(s, 0, sizeof(s));
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &str[i][j]);
memcpy(s, str, sizeof(str));
//print();
int ans = INF;
for(int i = 0; i < (1 << n); ++i) {
int d = slove(i);
//printf("%d+++\n", d);
if(ans > d) ans = d;
memcpy(s, str, sizeof(str));
}
//print();
//printf("%d----\n", ans);
printf("Case %d: ", ++kase);
if(ans == INF) printf("-1\n");
else printf("%d\n", ans);
}
return 0;
}
11464 Even Parity
最新推荐文章于 2022-03-23 10:39:03 发布