poj 1222 EXTENDED LIGHTS OUT

题目链接

poj 1222 EXTENDED LIGHTS OUT

题解

高斯消元解异或方程
一盏灯最多会被按一次
一个灯作为一个式子的一个变量
两盏灯相互影响系数设为1,补影响设为0
常数项代表最后需不需要这盏灯改变状态
guass消元解这个异或方程组就行了

代码

#include<cstdio>
#include<bitset>
#include<algorithm>
using std::bitset;
const int maxn = 37;
bitset<maxn> a[maxn];
inline int read() {
	int x = 0,f = 1;
	char c = getchar();
	while(c < '0'||c > '9') {if(c == '-') f = -1;c=getchar();}
	while(c <='9'&&c >= '0') x=x*10+c-'0',c=getchar();
	return x * f;
}
void Guass() {
	int now = 1;
	for(int i = 1;i <= 30;++ i) {
		int j = now;
		while(j <= 30 && !a[i][j]) j++;
		if(now != j) swap(a[now],a[j]);
		for(int k = 1;k <= 30;++ k) 
			if(k != now && a[k][i]) a[k]^=a[now];
		now++;
	}
}
int main() {
	int T = read();
	for(int t = 1;t <= T; ++t) {
		for(int i = 1;i <= 5; ++ i) 
			for(int j = 1;j <= 6;++ j) {
				int id = (i - 1) * 6 + j;
				a[id][id]=1;
				if(i!=1) a[id][id - 6] = 1;
				if(i!=5) a[id][id + 6] = 1;
				if(j!=1) a[id][id - 1] = 1;
				if(j!=6) a[id][id + 1] = 1;
				a[id][31] = read();
			}
		Guass();
		printf("PUZZLE #%d\n",t);
		for(int i = 1;i <= 5;++ i) { 
			for(int j = 1;j <= 6;++ j) 
				printf("%d ",a[(i-1)*6+j][31] ? 1 : 0);	
			puts("");
		}
	}
	return 0;
}
posted @ 2018-03-31 22:03  zzzzx  阅读(193)  评论(2编辑  收藏  举报