#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N=105; int equ,var; int a[N][N]; int b[N][N]; int x[N]; bool free_x[N]; int free_num; int ans=100000000; int absx(int x) { return x<0? -x:x; } void Debug() { int i,j; for(i=0;i<equ;i++) { for(j=0;j<var+1;j++) { cout<<a[i][j]<<" "; } cout<<endl; } } int gcd(int a,int b) { return b? gcd(b,a%b):a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } int dfs(int p) { int i,j; if(p<free_num) { for(i=free_num-1;i>=0;i--) { int temp=a[i][var]%2; for(j=i+1;j<var;j++) if(a[i][j]!=0) temp=(temp-(a[i][j]*x[j])%2+2)%2; x[i]=(temp/a[i][i])%2; } int sum=0; for(int i=0;i<var;i++) sum+=x[i]; if(ans>sum) ans=sum; return 0; } x[p]=0; dfs(p-1); x[p]=1; dfs(p-1); } int Gauss() { int i,j,k,col=0; for(k=0;k<equ&&col<var;k++,col++) { int max_r=k; for(i=k+1;i<equ;i++) { if(a[i][col]>a[max_r][col]) max_r=i; } if(max_r!=k) { for(i=k;i<var+1;i++) swap(a[k][i],a[max_r][i]); } if(a[k][col]==0) { k--;continue; } for(i=k+1;i<equ;i++) { if(a[i][col]!=0) { int LCM=lcm(a[i][col],a[k][col]); int ta=LCM/a[i][col]; int tb=LCM/a[k][col]; if(a[i][col]*a[k][col]<0) tb=-tb; for(j=col;j<var+1;j++) a[i][j]=((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2; } } } for(i=k;i<equ;i++) if(a[i][col]!=0) return -1; for(i=0;i<equ;i++) { if(!a[i][i]) { for(j=i+1;j<var;j++) if(a[i][j]) break; if(j==var) break; for(k=0;k<equ;k++) swap(a[k][i],a[k][j]); } } free_num=k; if(var-k>0) { dfs(var-1); return ans; } if(var-k==0) { for(i=k-1;i>=0;i--) { int temp=a[i][var]%2; for(j=i+1;j<var;j++) if(a[i][j]!=0) temp=(temp-(a[i][j]*x[j])%2+2)%2; x[i]=(temp/a[i][i])%2; } int sum=0; for(i=0;i<var;i++) sum+=x[i]; return sum; } } int main() { int i,j,k; char str[20]; memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); ans=1000000000; for(i=0;i<4;i++) { cin>>str; for(j=0;j<4;j++) { k=4*i+j; a[k][k]=1; if(i>0) a[k][k-4]=1; if(i<3) a[k][k+4]=1; if(j>0) a[k][k-1]=1; if(j<3) a[k][k+1]=1; if(str[j]=='b') a[k][16]=1; } } for(i=0;i<16;i++) for(j=0;j<=16;j++) b[i][j]=a[i][j]; for(k=0;k<16;k++) b[k][16]^=1; equ=var=16; int f1=Gauss(); int min1=ans; for(i=0;i<16;i++) for(j=0;j<=16;j++) a[i][j]=b[i][j]; ans=100000000; int f2=Gauss(); int min2=ans; if (f1==-1&&f2==-1) cout<<"Impossible"<<endl; else cout<<min(ans,min1)<<endl; return 0; }
作者:ACdreamers 发表于2013-5-31 3:49:30 原文链接
阅读:122 评论:0 查看评论