【POJ1222】EXTENDED LIGHTS OUT 高斯消元、解异或方程组

#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("");
		}
	}
}
时间: 2024-08-10 19:10:26

【POJ1222】EXTENDED LIGHTS OUT 高斯消元、解异或方程组的相关文章

BZOJ 3563 DZY Loves Chinese / BZOJ 3569 DZY Loves Chinese II 随机化+高斯消元解异或方程组

题目大意:给出一个无向图,问删掉k条边的时候,图是否联通. 思路:虽然我把这两个题放在了一起,但是其实这两个题可以用完全不同的两个解法来解决. 第一个题其实是DZY出错了...把每次的边数也异或了,那就直接用这个性质一个一个往后推就行了..最后一个暴力求一下.. 第二个题才是本意啊. 听到做法的时候我惊呆了.. 首先是将整个图中拆出一个树,那么所有边就分为树边和非树边.将所有非树边都加一个随机权值.树边的权值是所有能够覆盖它的非树边的权值的异或和. 把整个图拆开的充要条件是拆掉一条树边,同时将所

【BZOJ2466】【中山市选2009】树 高斯消元解异或方程组

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44356273"); } 题解: 参照此题解,也是我写的,俩题一样. [POJ1681]Painter's Problem 高斯消元,求最小∑系数的异或方程组 代码: #include <cmath> #include &

Hdu 5833 Zhu and 772002(高斯消元解异或方程组)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5833 思路: 将每个数质因数分解,若该位质因数指数为偶数,则该位a[i]为0,否则该位a[i]为1(记a[i]为质因数分解后第i个质数所对应值). 合法方案为积的各位质因子个数对应值a[i]异或值为0. 例3=3^1,4=2^2,则3*3*4对应: 2           3 0   (1 xor 1=0) 则可列方程组 a11x1+a12x2+...+a1nxn=0 a21x1+a22x2+...

POJ 1222-EXTENDED LIGHTS OUT(高斯消元求解异或方程组)

题目地址:POJ 1222 题意:有一个5*6的矩阵,每个位置都表示按钮和灯,1表示亮,0表示灭.每当按下一个位置的按钮,它和它周围灯的状态全部翻转(题目中给出如何影响),问在这样的一个方阵中按下哪些按钮可以把整个方阵都变成灭的,这时1表示按了,0表示没按. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream>

UVA 1560 - Extended Lights Out(高斯消元)

UVA 1560 - Extended Lights Out 题目链接 题意:给定一个矩阵,1代表开着灯,0代表关灯,没按一个开关,周围4个位置都会变化,问一个按的方法使得所有灯都变暗 思路:两种做法: 1.枚举递推 这个比较简单,就枚举第一行,然后递推过去,每次如果上一行是亮灯,则下一行开关必须按下去 2.高斯消元, 这个做法比较屌一些,每个位置对应上下左右中5个位置可以列出一个异或表达式,然后30个位置对应30个异或表达式,利用高斯消元法就能求出每个位置的解了 代码: 高斯消元法: #inc

【poj1830-开关问题】高斯消元求解异或方程组

第一道高斯消元题目~ 题目:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任务是,计算有多少种可以达到指定状态的方法.(不计开关操作的顺序)0<=N<=29 我们用样例来模拟一下: 我的高斯消元求解异或方程组模版: 1 int gauss

POJ 1222 extended lights out 高斯消元 板子题

题目链接:http://poj.org/problem?id=1222 题目描述:其实就是开关问题, 按下按钮会影响当前和周围的四个按钮, 问关闭所有灯的方案 解题思路:以前用搜索做过, 那时候是刚刚接触ACM的时候, 当时劲头真足啊, 这个解释的很好:http://blog.csdn.net/u013508213/article/details/47263183 代码: #include <iostream> #include <cstdio> #include <cstr

POJ 1222 EXTENDED LIGHTS OUT 高斯消元

点击打开链接 EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6492   Accepted: 4267 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 butt

poj2947(高斯消元解同模方程组)

题目链接:http://poj.org/problem?id=2947 题意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下: p start enda1, a2......ap (1<= ai <= n)第一行表示从星期 start 到星期 end 一共生产了p 件装饰物 (工作的天数为end - start + 1 + 7*x, 加 7*x 是因为它可能生产很多周),第二行表示这 p 件装饰物的种类(可能出现相同的种类,即 ai = aj).规定每件装饰物至少生产3 天,最多生产9