#include <stdio.h>
int main()
{
puts("转载请注明出处[vmurder]谢谢");
puts("网址:blog.csdn.net/vmurder/article/details/43481693");
}
题意:
多组数据、
有个5*6的图,然后你要对某些位置进行操作,使得最后灯的状态如图。
操作:这个灯位置的上下左右以及自己这五盏灯状态都取反。
然后输出操作。
说实话什么亮灭什么我全都没考虑。
直接瞎写一遍就PE了,改改就AC了。
高斯消元解异或方程组:
跟正常高斯消元一样,只不过拿一个式子A消式子B的时候,是用异或而不是加减乘除。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 50
using namespace std;
const int dx[]={0,0,0,1,-1};
const int dy[]={0,1,-1,0,0};
bool a[N][N],ans[N];
void Gauss(int n,int m)
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=i;j<=n&&!a[j][i];j++);
if(i!=j)for(k=i;k<=m;k++)swap(a[i][k],a[j][k]);
for(j=i+1;j<=n;j++)if(a[j][i])
for(k=i;k<=m;k++)
a[j][k]^=a[i][k];
}
for(i=n;i;i--)
{
ans[i]=a[i][m];
for(j=n;j>i;j--)ans[i]^=(a[i][j]*ans[j]);
}
}
int n,m,id[N][N],cnt;
int main()
{
freopen("test.in","r",stdin);
int i,j,k;
int t,g,_g;
n=5,m=6;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)id[i][j]=++cnt;
for(scanf("%d",&_g),g=1;g<=_g;g++)
{
printf("PUZZLE #%d\n",g);
memset(a,0,sizeof a);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&a[id[i][j]][/*n*m+1*/31]);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)for(k=0;k<=4;k++)
{
if(t=id[i+dx[k]][j+dy[k]])a[id[i][j]][t]=1;
else a[id[i][j]][t]=0;
}
Gauss(n*m,n*m+1);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(j-1)printf(" ");
printf("%d",ans[id[i][j]]);
}
puts("");
}
}
}