11464 - Even Parity

来源:互联网 发布:win10软件不见了 编辑:程序博客网 时间:2024/06/06 17:25

题目地址


https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=456&problem=2459&mosmsg=Submission+received+with+ID+18688745这道题很有深度。至少对于我是这样的。深刻明白了二进制状态压缩。全面地巩固了位运算!呵呵。早上吃完饭就在思考。到现在终于懂了~

#include<iostream>#include<cstring>#define INF 1000000000int a[20][20],b[20][20],n;using namespace std;int check(int s){memset(b,0,sizeof(b));for(int i=0;i<n;i++)if(s&(1<<i))b[0][i]=1;else if(a[0][i]==1)return INF;for(int i=1;i<n;i++)  for(int j=0;j<n;j++)  {  int sum=0;  if(i>1)sum+=b[i-2][j];  if(j>0)sum+=b[i-1][j-1];  if(j<n-1)sum+=b[i-1][j+1];  b[i][j]=sum%2;  if(a[i][j]==1&&b[i][j]==0)return INF;      } int cont=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(a[i][j]!=b[i][j])cont++;return cont;}int main(){int T,ans;cin>>T;for(int count=1;count<=T;count++){ans=INF;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)   cin>>a[i][j];for(int s=0;s<(1<<n);s++)  ans=min(ans,check(s));  if(ans==INF) ans=-1;  printf("Case %d: %d\n",count,ans);}return 0;}


0 0