poj1222(高斯消元解XOR方程(模2方程))
ac代码:
#include<bits/stdc++.h> #define per(i,a,b) for(int i=a;i<=b;i++) #define inf 2000000000 using namespace std; typedef long long ll; //---------------------head const int N=40; int equ,var; int a[N][N]; int x[N];//解集 void init(){ memset(a,0,sizeof(a)); equ=var=30; for(int i=0;i<5;i++){ for(int j=0;j<6;j++){ int t=i*6+j; a[t][t]=1; if(i>0)a[(i-1)*6+j][t]=1; if(i<4)a[(i+1)*6+j][t]=1; if(j>0)a[i*6+j-1][t]=1; if(j<5)a[i*6+j+1][t]=1; } } } int Gauss(){ int i,j,k; int max_r,col; for(k=0,col=0;k<equ&&col<var;k++,col++){ max_r=k; for(i=k+1;i<equ;i++)if(abs(a[i][col])>abs(a[max_r][col]))max_r=i; if(max_r!=k)for(j=col;j<=var;j++)swap(a[k][j],a[max_r][j]); if(a[k][col]==0){k--;continue;} for(i=k+1;i<equ;i++){ if(a[i][col]!=0)for(j=col;j<=var;j++)a[i][j]^=a[k][j]; } } for(i=var-1;i>=0;i--){ x[i]=a[i][var]; for(j=i+1;j<var;j++)x[i]^=(a[i][j]&&x[j]); } return 0; } int main() { //freopen("Data_In.txt","r",stdin); int T,cas=0; scanf("%d",&T); while(T--){ cas++; init(); per(i,0,29)scanf("%d",&a[i][30]); Gauss(); printf("PUZZLE #%d\n",cas); for(int i=0;i<30;i++){ printf("%d%c",x[i]," \n"[i%6==5?1:0]); } } return 0; }