http://poj.org/problem?id=1222
在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
#define LL long long
int a[]={};
int x[][]={};
int id[]={};
int main(){
int T;scanf("%d",&T);
for(int k=;k<=T;++k){
int y;memset(x,,sizeof(x));memset(id,,sizeof(id));
for(int i=;i<=;i++){
scanf("%d",&a[i]);y=i%;if(y==)y=;
x[i][]=a[i]; x[i][i]=;
if(i->)x[i][i-]=;
if(y>)x[i][i-]=;
if(i+<=)x[i][i+]=;
if(y<)x[i][i+]=;
}
for(int i=;i<;i++){
if(!x[i][i]){
for(int j=i+;j<=;j++){
if(x[j][i]){
for(int w=i;w<=;w++){
swap(x[j][w],x[i][w]);
}swap(x[j][],x[i][]);
break;
}
}
}
if(!x[i][i])continue;
for(int j=i+;j<=;j++){
if(!x[j][i])continue;
for(int w=i;w<=;w++){
x[j][w]^=x[i][w];
}x[j][]^=x[i][];
}
}
for(int i=;i>=;i--){
int z=;
for(int j=;j>i;j--)z^=(x[i][j]*id[j]);
if(x[i][i]==)id[i]=;
else{
if(z==x[i][]){
id[i]=;
}
else{
id[i]=;
}
}
}
printf("PUZZLE #%d\n",k);
for(int i=;i<=;i++){
for(int j=;j<=;j++){
printf("%d ",id[(i-)*+j]);
}printf("\n");
}
}
return ;
}