1.UVa 11300
状态压缩,枚举第一行的状态进行check即可
#include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define dec(i,x,y) for(register int i=x;i>=y;i--) #define ll long long using namespace std; const int N=20; const int inf=0x3f3f3f3f; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f;} int kase,n; int a[N][N],b[N][N]; inline 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(1<i) sum+=b[i-2][j]; if(0<j) 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 cnt=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(a[i][j]!=b[i][j]) cnt++; return cnt;} int main(){ int T;T=read(); while(T--){ n=read(); for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=read(); int ans=inf; for(int s=0;s<(1<<n);s++) ans=min(ans,check(s)); if(ans==inf) ans=-1; printf("Case %d: %d\n",++kase,ans); } }