#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<map>
#include<set>
#include<sstream>
using namespace std;
const int INF = 0x3f3f3f3f;
int board[20][20];
int temp[20][20];
int n;
int check(int s)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
temp[i][j] = board[i][j];
}
}
for (int i = 1; i <= n; i++)
{
if (s & 1 << i - 1)
{
if (board[1][i] == 1)
{
return INF;
}
else
temp[1][i] = 1;
}
}
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int sum = 0;
if (i > 2)
sum += temp[i - 2][j];
if (j != 1)
sum += temp[i - 1][j - 1];
if (j != n)
sum += temp[i - 1][j + 1];
if (sum % 2 == 0 && board[i][j] == 1)
{
return INF;
}
temp[i][j] = sum % 2;
}
}
int Count = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (temp[i][j] != board[i][j])
Count++;
return Count;
}
int main()
{
int T;
cin >> T;
int cas = 1;
while (T--)
{
cin >> n;
memset(board, 0, sizeof(board));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> board[i][j];
}
}
int end = 1 << n;
int Max = INF;
for (int s = 0; s < end; s++)
{
Max = min(Max, check(s));
}
if (Max == INF)
{
Max = -1;
}
printf("Case %d: %d\n", cas++, Max);
}
return 0;
}
UVA11464
最新推荐文章于 2020-08-28 21:56:41 发布