http://poj.org/problem?id=1222
在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 using namespace std; 8 #define LL long long 9 int a[35]={}; 10 int x[35][35]={}; 11 int id[35]={}; 12 int main(){ 13 int T;scanf("%d",&T); 14 for(int k=1;k<=T;++k){ 15 int y;memset(x,0,sizeof(x));memset(id,0,sizeof(id)); 16 for(int i=1;i<=30;i++){ 17 scanf("%d",&a[i]);y=i%6;if(y==0)y=6; 18 x[i][0]=a[i]; x[i][i]=1; 19 if(i-6>0)x[i][i-6]=1; 20 if(y>1)x[i][i-1]=1; 21 if(i+6<=30)x[i][i+6]=1; 22 if(y<6)x[i][i+1]=1; 23 } 24 for(int i=1;i<30;i++){ 25 if(!x[i][i]){ 26 for(int j=i+1;j<=30;j++){ 27 if(x[j][i]){ 28 for(int w=i;w<=30;w++){ 29 swap(x[j][w],x[i][w]); 30 }swap(x[j][0],x[i][0]); 31 break; 32 } 33 } 34 } 35 if(!x[i][i])continue; 36 for(int j=i+1;j<=30;j++){ 37 if(!x[j][i])continue; 38 for(int w=i;w<=30;w++){ 39 x[j][w]^=x[i][w]; 40 }x[j][0]^=x[i][0]; 41 } 42 } 43 for(int i=30;i>=1;i--){ 44 int z=0; 45 for(int j=30;j>i;j--)z^=(x[i][j]*id[j]); 46 if(x[i][i]==0)id[i]=0; 47 else{ 48 if(z==x[i][0]){ 49 id[i]=0; 50 } 51 else{ 52 id[i]=1; 53 } 54 } 55 } 56 printf("PUZZLE #%d ",k); 57 for(int i=1;i<=5;i++){ 58 for(int j=1;j<=6;j++){ 59 printf("%d ",id[(i-1)*6+j]); 60 }printf(" "); 61 } 62 } 63 return 0; 64 }