UVA11464

来源:互联网 发布:淘宝店拍照技巧 编辑:程序博客网 时间:2024/06/01 16:08
#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;}
0 0
原创粉丝点击