UVa 11464 Even Parity——思路题

来源:互联网 发布:metasploit和数据库 编辑:程序博客网 时间:2024/06/10 14:24

只枚举第一行便可根据第一行推出整个矩阵

注意n = 1输出0

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;int n, ans;int a[20][20], b[20][20];void solve() {    ans = INF;    int len = 1<<n;    for (int kase = 0; kase < len; kase++) {        memset(b, 0, sizeof(b));//全部清零,同时加了一圈零边        int base = 1;        for (int i = 1; i <= n; i++) {            if (kase & base) b[1][i] = 1;            base *= 2;        }        for (int i = 2; i <= n; i++) {            for (int j = 1; j <= n; j++) {                b[i][j] = (b[i-2][j] + b[i-1][j-1] + b[i-1][j+1])%2==0 ? 0 : 1;            }        }        bool ok = true;        int temp = 0;        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= n; j++) {                if (a[i][j] == 1 && b[i][j] == 0) { ok = false; i = n + 1; break; }                if (a[i][j] == 0 && b[i][j] == 1) temp++;            }        }//        cout << endl;//        for (int i = 1; i <= n; i++) {//            for (int j = 1; j <= n; j++) {//                cout << b[i][j] << " ";//            }//            cout << endl;//        }//        cout << endl;        if (ok) ans = min(ans, temp);    }    if (ans == INF) printf("-1\n");    else printf("%d\n", ans);}int main(){    int T; scanf("%d", &T);    for (int kase = 1; kase <= T; kase++) {        scanf("%d", &n);        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= n; j++) {                scanf("%d", &a[i][j]);            }        }        printf("Case %d: ", kase);        if (n == 1) printf("0\n");        else solve();    }    return 0;}


原创粉丝点击