千年老题,以前用枚举做,现在用高斯消元做
自由元直接做成0即可
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int a[55][55]; 7 int ans[6][7]; 8 int c(int x,int y){return (x*6+y+1);} 9 int d[5]={0,-1,0,1,0}; 10 void gauss(int m,int n){ 11 int line=1; 12 for(int k=1;k<=m;k++){ 13 int i=line; 14 while(i<=m){if(a[i][k])break;i++;} 15 if(i>m)continue; 16 if(i!=line){swap(a[i],a[line]);} 17 for(i=1;i<=m;i++){ 18 if(i!=line&&a[i][k]){ 19 for(int j=k;j<=n;j++){ 20 a[i][j]^=a[line][j]; 21 } 22 } 23 } 24 line++; 25 } 26 // for(int i=1;i<=30;i++){ 27 // for(int j=1;j<=30;j++){ 28 // printf("%d ",a[i][j]); 29 // } 30 // printf("\n"); 31 // } 32 for(int i=0;i<5;i++){ 33 for(int j=0;j<6;j++){ 34 ans[i][j]=a[c(i,j)][n]; 35 } 36 } 37 } 38 void solve(){ 39 memset(a,0,sizeof(a)); 40 memset(ans,0,sizeof(ans)); 41 int x; 42 for(int i=0;i<5;i++){ 43 for(int j=0;j<6;j++){ 44 scanf("%d",&x); 45 a[c(i,j)][31]=x; 46 a[c(i,j)][c(i,j)]=1; 47 for(int k=0;k<4;k++){ 48 int x=i+d[k],y=j+d[k+1]; 49 if(x>=0&&x<5&&y>=0&&y<6)a[c(i,j)][c(x,y)]=1; 50 } 51 } 52 } 53 gauss(30,31); 54 for(int i=0;i<5;i++){ 55 for(int j=0;j<5;j++){ 56 printf("%d ",ans[i][j]); 57 } 58 printf("%d\n",ans[i][5]); 59 } 60 } 61 int main() 62 { 63 // freopen("data.in","r",stdin); 64 int T; 65 scanf("%d",&T); 66 for(int i=1;i<=T;i++){ 67 printf("PUZZLE #%d\n",i); 68 solve(); 69 } 70 return 0; 71 }