2013年11月12日 星期二

[UVA] 11464 - Even Parity


#include<stdio.h>
#include<string.h>
int A[20][20],B[20][20]={0},n;
int main(){
    int t,i,j,k,x,y,ans,C=0;
    scanf("%d",&t);
    while(t--){
        memset(B,0,sizeof(B));
        scanf("%d",&n);
        ans=1e8;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&A[i][j]);
        for(k=0;k<(1<<n);k++){
            for(x=1,y=k;x<=n;x++,y/=2)
                B[1][x]=y%2;
            for(i=2;i<=n;i++)
                for(j=1;j<=n;j++)
                    B[i][j]=(B[i-1][j-1]+B[i-1][j+1]+B[i-2][j])%2;
            x=0;
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++){
                    if(A[i][j]!=B[i][j])
                        x++;
                    if(A[i][j]!=B[i][j] && A[i][j]){
                        x=-1;
                        goto go;
                    }
                }
            for(i=1;i<=n;i++){
                y=(B[n-1][i]+B[n][i-1]+B[n][i+1])%2;
                if(y==1) x=-1;
            }
            go:;
            if(x>=0 && x<ans){
                ans=x;
            }
        }
        if(ans!=1e8)
        printf("Case %d: %d\n",++C,ans);
        else printf("Case %d: %d\n",++C,-1);
    }
}

沒有留言:

張貼留言