高斯消元
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define LL long long
using namespace std;
const int N=35;
int lx[4]={1,-1,0,0};
int ly[4]={0,0,1,-1};
int a[N][N];
int ans[N];
int n;
void Gauss()
{
int row=0;
int col=0;
while(row<n&&col<n)
{
int k=-1;
for(int i=row;i<n;++i)
{
if(a[i][col]!=0)
{
k=i;break;
}
}
if(k!=row)
{
for(int j=col;j<=n;++j)
{
swap(a[row][j],a[k][j]);
}
}
int x=a[row][col];
for(int i=row+1;i<n;++i)
{
int y=a[i][col];
for(int j=col;j<=n;++j)
{
a[i][j]=(a[i][j]*x-y*a[row][j])%2;
}
}
++row;++col;
}
//cout<<row<<" "<<col<<endl;
for(int i=row-1;i>=0;--i)
{
int sum=0;
for(int j=i+1;j<n;++j)
sum=sum+(ans[j]*a[i][j]);
ans[i]=(a[i][n]-sum)/a[i][i]%2;
}
for(int i=0;i<5;++i)
{
for(int j=0;j<6;++j)
{
printf("%d",(ans[i*6+j]+2)%2);
if(j<5)
printf(" ");
}
printf("\n");
}
}
int main()
{
n=30;
int T;
scanf("%d",&T);
for(int w=1;w<=T;++w)
{
memset(a,0,sizeof(a));
for(int i=0;i<5;++i)
{
for(int j=0;j<6;++j)
{
int x;
scanf("%d",&x);
if(x==1)
a[i*6+j][n]=1;
a[i*6+j][i*6+j]=1;
for(int l=0;l<4;++l)
{
int l1=i+lx[l];
int l2=j+ly[l];
if(l1>=0&&l1<5&&l2>=0&&l2<6)
{
a[l1*6+l2][i*6+j]=1;
}
}
}
}
printf("PUZZLE #%d\n",w);
Gauss();
}
return 0;
}
浙公网安备 33010602011771号