这个题有很多解法,不过还是觉得高斯消元比较好……
以前用其他方法做的:
#include<iostream> #include<cstring> using namespace std; int press[6][8]; int puzzle[6][8]; int main() { int i,n; cin>>n; for(i=1;i<=n;i++) { int j,k,m,a; memset(press,0,sizeof(press)); for(j=1;j<=5;j++) for(k=1;k<=6;k++) cin>>puzzle[j][k]; for(j=1;j<6;j++) press[1][j]=0; while(1) { for(m=2;m<6;m++) for(a=1;a<7;a++) press[m][a]=(puzzle[m-1][a]+press[m-1][a]+press[m-1][a+1]+press[m-1][a-1]+press[m-2][a])%2; for(a=1;a<7;a++) if((press[5][a]+press[4][a]+press[5][a+1]+press[5][a-1])%2!=puzzle[5][a]) break; if(a==7) break; press[1][1]++; k=1; while(press[1][k]>1) { press[1][k+1]++; k++; press[1][k-1]=0; } } cout<<"PUZZLE #"<<i<<endl; for(a=1;a<=5;++a) { cout<<press[a][1]<<' '; for(j=2;j<7;++j) cout<<press[a][j]<<' '; cout<<endl; } } return 0; }
用高斯消元做的:
#include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> using namespace std; int an[30][31],ans[30]; void Gauss(int n) { int i,j,k,ma,mb,LCM; for(i=0;i<n;i++){ int row=i; for(j=i+1;j<n;j++){ if(an[row][i]<an[j][i]) row=j; } if(row!=i){ for(j=0;j<=n;j++) swap(an[row][j],an[i][j]); } for(j=i+1;j<n;j++){ if(an[j][i]){ for(k=i;k<=n;k++){ an[j][k]^=an[i][k]; } } } } for(i=29;i>=0;i--){ for(j=i+1;j<n;j++) an[i][30]^=(ans[j]*an[i][j]); ans[i]=an[i][30]; } } int main() { int t,len,i,j,k=0,a,b,x,y,cnt; cin>>t; while(t--){ for(i=0;i<30;i++){ cin>>an[i][30]; ans[i]=0; } for(i=0;i<30;i++){ a=i/6; b=i%6; for(j=0;j<30;j++){ x=j/6; y=j%6; if(abs(a-x)+abs(b-y)<=1) an[i][j]=1; else an[i][j]=0; } } Gauss(30); printf("PUZZLE #%d ",++k); cnt=0; for(i=0;i<30;i++){ cout<<ans[i]; if(i%6==5) cout<<endl; else cout<<' '; } } }