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;
}

 

posted @ 2018-10-07 21:44  WindFreedom  阅读(786)  评论(0编辑  收藏  举报