11464Even Parity

来源:互联网 发布:用网络命令查看dns 编辑:程序博客网 时间:2024/06/14 06:57
#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;}


0 0