题目:
题目链接:Extended Lights Out
题解:
一个很暴力的题面,但是因为学了高斯消元,就用高斯消元的写了,这个题是异或版本的高斯消元,由于数据较小,所以直接建一个30*30的矩阵就行,然后就可以把每一个位置上放上一个异或的式子就行。
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1; ch=getchar();}
while(ch<='9'&&ch>='0') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int sea=35;
int T,n,m,cnt;
int a[sea][sea],ans[6][6];
int d[5][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1}};
void gos()
{
for(int i=0;i<n;i++)
{
int p=i;
for(;p<n;p++) if(a[p][i]) break;
for(int j=0;j<=n;j++) swap(a[i][j],a[p][j]);
for(int j=0;j<n;j++)
{
if(i==j) continue;
if(a[j][i]) for(int k=i;k<=n;k++) a[j][k]^=a[i][k];
}
}
for(int i=n-1;i>=0;i--) ans[i/6][i%6]=a[i][n];
}
int main()
{
scanf("%d",&T); n=30;
while(T--)
{
memset(a,0,sizeof(a));
for(int i=0;i<n;i++) a[i][n]=read();
for(int i=0;i<n;i++)
{
int x=i/6,y=i%6;
for(int j=0;j<5;j++)
{
int xx=x+d[j][0],yy=y+d[j][1];
if(xx<0||xx>=5||yy<0||yy>=6) continue;
a[i][xx*6+yy]=1;
}
}
gos();
printf("PUZZLE #%d\n",++cnt);
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++) printf("%d ",ans[i][j]);
printf("%d\n",ans[i][5]);
}
}
return 0;
}