poj 1222 EXTENDED LIGHTS OUT (高斯消元)

给出一个矩阵,按下某个位置会使周围反转,0变1,1变0,现在问按那些点能使矩阵全变为0.

这位大牛的题解将的很清楚


#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define B(x) (1<<(x))
typedef long long ll;
const int oo=0x3f3f3f3f;
const ll OO=1LL<<61;
const int MOD=10007;
const int maxn=35;
int maze[maxn][maxn];
int ans[maxn];

void Gauss(){

    int k,i,j;
    for(k=0;k<30;k++){

        for(i=k;i<30;i++){
            if(maze[i][k]!=0)break;
        }
        for(j=0;j<=30;j++){
            swap(maze[k][j],maze[i][j]);
        }
        for(i=0;i<30;i++){
            if(i!=k&&maze[i][k]){
                for(int j=0;j<=30;j++)
                    maze[i][j]^=maze[k][j];
            }
        }
    }
    for(i=0;i<30;i++)ans[i]=maze[i][30];
}

int main(){

    int T;
    scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){

        memset(maze,0,sizeof maze);
        memset(ans,0,sizeof ans);
        for(int i=0;i<30;i++)
            scanf("%d",&maze[i][30]);
        for(int i=0;i<30;i++){

            maze[i][i]=1;
            if(i%6!=0) maze[i-1][i]=1;
            if(i%6!=5) maze[i+1][i]=1;
            if(i>5) maze[i-6][i]=1;
            if(i<24) maze[i+6][i]=1;
        }
        Gauss();
        printf("PUZZLE #%d\n",cas);
        for(int i=0;i<30;i++){
            printf("%d",ans[i]);
            if(i%6==5)printf("\n");
            else printf(" ");
        }
    }
    return 0;
}
/**

*/



你可能感兴趣的:(poj 1222 EXTENDED LIGHTS OUT (高斯消元))