UVa 11464 Even Parity(枚举)

来源:互联网 发布:远程桌面端口修改 编辑:程序博客网 时间:2024/06/05 13:23
枚举第一行 可以确定下面所有行的情况 只需枚举2^15种情况
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int N;int kase=1;int a[17][17];int ini[17][17];int check(){int res=0;for(int i=1;i<N;i++){for(int j=1;j<=N;j++){int sum=a[i][j-1]+a[i][j+1]+a[i+1][j]+a[i-1][j];if(sum&1){if(a[i+1][j]) return -1;else{a[i+1][j]=1;res++;}}}}for(int i=1;i<=N;i++){int sum=a[N][i-1]+a[N][i+1]+a[N-1][i];if(sum&1) return -1;}return res;}void input(){scanf("%d",&N);for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){scanf("%d",&ini[i][j]);}}}int main(){int T;cin>>T;while(T--){input();int ans=10000000;int t=1;for(int i=1;i<=N;i++) t*=2;for(int k=0;k<t;k++){memset(a,0,sizeof(a));for(int i=2;i<=N;i++){for(int j=1;j<=N;j++){a[i][j]=ini[i][j];}}int cur=0;int kk=k;bool flag=1;for(int i=1;i<=N;i++){if(kk&1) a[1][i]=1;kk>>=1;if(a[1][i]!=ini[1][i]){if(ini[1][i]==1){flag=0;}else cur++;}}if(!flag) continue;int tmp=check();if(tmp!=-1){ans=min(ans,cur+tmp);}}printf("Case %d: ",kase++);if(ans==10000000) printf("-1\n");else printf("%d\n",ans);}return 0;}/*130 0 01 0 00 0 0*/

0 0
原创粉丝点击