UVa 11464 Even Parity(枚举)
2015-01-18 12:19
393 查看
枚举第一行 可以确定下面所有行的情况 只需枚举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 [i-1]+a [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; } /* 1 3 0 0 0 1 0 0 0 0 0 */
相关文章推荐
- 状态压缩+枚举 UVA 11464 Even Parity
- UVA 11464 Even Parity(枚举递推)
- 暴力枚举- uva11464 - Even Parity
- UVA 11464 - Even Parity(枚举方法)
- 【UVA】11464-Even Parity(二进制枚举子集)
- UVa 11464 Even Parity (想法题&部分枚举)
- uva 11464 - Even Parity(暴力枚举)
- uva 11464 - Even Parity (枚举+递推)
- uva 11464 Even Parity 模拟 二进制枚举
- UVA 11464 Even Parity(递归枚举)
- UVA 11464 - Even Parity(枚举方法)
- UVA 11464 Even Parity(部分枚举 递推)
- UVA - 11464 Even Parity 枚举
- UVA11464 Even Parity (局部枚举定全局枚举)
- UVA 11464 Even Parity(枚举)
- UVA - 11464 Even Parity 枚举+递推
- uva - 11464 - Even Parity(部分枚举,递推)
- UVa 11464 - Even Parity(枚举)
- UVA 11464 Even Parity(暴力枚举)
- uva 11464 - Even Parity(暴力枚举)