POJ 1222 高斯消元

高斯消元和二进制枚举都可以做这道题。

这里是高斯消元的代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int a[35][35]; //
int x[35];  // 记录答案
void init(){
    memset(a,0,sizeof(a));
    memset(x,0,sizeof(x));
    for(int i=0;i<5;i++){
        for(int j=0;j<6;j++){
            int t = i*6+j;
            a[i*6+j][t] = 1; // itself
            if(i>0)a[(i-1)*6+j][t] = 1; // top
            if(i<4)a[(i+1)*6+j][t] = 1; // bottom
            if(j>0)a[i*6+j-1][t] = 1; // left
            if(j<5)a[i*6+j+1][t] = 1; // right
        }
    }
}
void read(){
    for(int i=0;i<5;i++){
        for(int j=0;j<6;j++)
            scanf("%d",&a[i*6+j][30]);
    }
}
void gauss(){
    int k,equ=30,var=30,maxr,col;
    for(k=0,col=0;k<equ && col < var;k++,col++){
        maxr = k;
        for(int i=k+1;i<equ;i++){
            if(a[i][col] > a[maxr][col])
                maxr = i;
        }
        if(maxr != k)
            for(int i=col;i<var+1;i++)
                swap(a[k][i],a[maxr][i]);
        for(int i=k+1;i<equ;i++)if(a[i][col]){
            for(int j=col;j<var+1;j++){
                a[i][j] ^= a[k][j];
            }
        }
    }
    for(int i=var-1;i>=0;i--){ // 回代
        //x[i] = a[i][var];
        for(int j=i+1;j<var+1;j++)if(a[i][j]){
            //x[i] ^= x[j];
            a[i][var] ^= a[j][var];
        }
    }
}
void print(int i){
    printf("PUZZLE #%d\n",i);
    for(int i=0;i<5;i++){
        for(int j=0;j<6;j++){
            printf("%d%c",a[i*6+j][30]," \n"[j==5]);
        }
    }
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        init();
        read();
        gauss();
        print(i);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/kongbb/p/10696609.html