CXLOVE的第一篇博文,先来一个水题
开灯关灯问题,5*6的灯阵,将每一个位置上的状态看做一个变元,30个变元,列出30个异或方程,高斯消元解方程即可
N年前就做过这题,当时是位运算枚举+递推
从此cxlove的博客就正式开通了,欢迎大牛拍砖
/*
ID:cxlove
PROB:POJ 1222
HINT:高斯消元
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
using namespace std;
int a[31][31]; //系数矩阵
int ans[31];
void gauss(){
for(int i=0;i<30;i++){
int k=i;
for(;k<30;k++)
if(a[k][i]!=0)
break;
for(int j=0;j<=30;j++)
swap(a[i][j],a[k][j]);
for(int j=0;j<30;j++)
if(i!=j&&a[j][i])
for(int k=0;k<=30;k++)
a[j][k]=a[i][k]^a[j][k];
}
}
int main(){
int t,tt=0;
scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));
for(int i=0;i<30;i++){
scanf("%d",&a[i][30]);
ans[i]=0;
}
for(int i=0;i<30;i++){
a[i][i]=1;
if(i%6!=0)
a[i-1][i]=1;
if(i%6!=5)
a[i+1][i]=1;
if(i>5)
a[i-6][i]=1;
if(i<24)
a[i+6][i]=1;
}
gauss();
/*for(int i=0;i<30;i++){
for(int j=0;j<=30;j++)
printf("%d ",a[i][j]);
printf("\n");
}*/
for(int j=0;j<30;j++)
ans[j]=a[j][30];
printf("PUZZLE #%d\n",++tt);
for(int i=0;i<30;i++){
printf("%d",ans[i]);
if(i%6==5)
printf("\n");
else
printf(" ");
}
}
return 0;
}