#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 16
const int INF = (1<<29);
int n;
int a[MAX][MAX], b[MAX][MAX];
inline int min(int a, int b)
{
return a < b ? a: b;
}
int solve(int situation)
{
memset(b, 0, sizeof(b));
for(int i = 0; i < n; ++i)
{
if(situation & (1<<i))
b[0][i] = 1;
else if(a[0][i] == 1)
return INF;
}
for(int i = 1; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
int sum = 0;
if(i > 1) sum += b[i-2][j];
if(j < n-1) sum += b[i-1][j+1];
if(j > 0) sum += b[i-1][j-1];
b[i][j] = sum%2;
if(a[i][j] == 1 && b[i][j] == 0)
return INF;
}
}
int count = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
if(a[i][j] != b[i][j])
count++;
return count;
}
int main()
{
// freopen("input.txt", "r", stdin);
int caseNum, num = 1;
scanf("%d", &caseNum);
while(caseNum--)
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &a[i][j]);
int result = INF;
for(int i = 0; i < (1<<n); ++i)
result = min(result, solve(i));
if(result == INF) printf("Case %d: -1\n", num++);
else printf("Case %d: %d\n", num++, result);
}
return 0;
}
11464-偶数矩阵
最新推荐文章于 2020-03-02 16:45:21 发布