https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2459
http://7xjob4.com1.z0.glb.clouddn.com/6892b750367614576602612088b7c161
题意:将给定n的01矩阵变为偶数矩阵
思路:枚举第一行的01情况,推出其他行的情况,判断是否符合,降复杂度为 O(2^n*n^2);
#include <bits/stdc++.h> using namespace std; int T; int n; int a[16][16]; int b[16][16]; int check(int s) { int i,j; int cnt=0; memset(b,0,sizeof(b)); for(i=1;i<=n;i++) { if(s & (1<<(i-1)) ) { b[1][i]=1; if(a[1][i]==0) cnt++; } if(a[1][i]==1 && b[1][i]==0) { return -1; } } for(i=2;i<=n;i++) { for(j=1;j<=n;j++) { int sum=0; if(i-2>=1) { sum+=b[i-2][j]; } if(j-1>=1) { sum+=b[i-1][j-1]; } if(j+1<=n) { sum+=b[i-1][j+1]; } if(sum%2==0) { b[i][j]=0; if(a[i][j]==1) return -1; } else { b[i][j]=1; if(a[i][j]==0) cnt++; } } } for(j=1;j<=n;j++) { int sum=0; if(n-1>=1) sum+=b[n-1][j]; if(j-1>=1) sum+=b[n][j-1]; if(j+1>=1) sum+=b[n][j+1]; if(sum%2==1) { return -1; } } return cnt; } int main() { int i,j; int cas=1; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } int ans=250; for(int s=0;s<(1<<n);s++) { int f=check(s); if(f>=0) { ans=min(ans,f); } } if(ans==250) ans=-1; printf("Case %d: %d ",cas++,ans); } return 0; }