由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组:

引用题解:

http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d297445264

题目大意:给你一个5*6的矩阵,矩阵里每一个单元都有一个灯和一个开关,如果按下此开关,那么开关所在位置的那个灯和开关前后左右的灯的状态都会改变(即由亮到不亮或由不亮到亮)。给你一个初始的灯的状态,问怎样控制每一个开关使得所有的灯最后全部熄灭(此题保证有唯一解)。

解题思路:高斯消元。很显然每个灯最多只需要按1下(因为按两下和没有按是一个效果)。我们可以定义30和未知数x0、x1.......x29代表每一个位置的开关是否被按。那么对于每一个灯的状态可以列一个方程,假设位置(i,j)处的开关为x(i*6+j),那么我们就可以列出方程:
x(i*6+j)+x((i-1)*6+j)+x((i+1)*6+j)+x(i*6+j-1)+x(i*6+j+1) = bo(mod 2)
(括号里的数字为x的下标,这里假设这些下标都是符合要求的,即都在矩形内,如果不在则可以去掉,当这个灯初始时是开着的,那么bo为1,否则为0)
这样可以列出30个方程,然后用高斯消元解这个方程组即可。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. #define N 31
  6. const int dx[]={0,-1,0,1},dy[]={-1,0,1,0},n=30;
  7. bool b[N],x[N],B[N][N+1],A[N][N+1];
  8. int T,id[7][8];
  9. void Madoka()
  10. {
  11. memcpy(B,A,sizeof(A));
  12. for(int i=1;i<=n;++i)
  13. B[i][n+1]=b[i];
  14. for(int i=1;i<=n;++i)
  15. {
  16. int j=i;
  17. for(;j<=n;++j)
  18. if(B[j][i])
  19. break;
  20. swap(B[j],B[i]);
  21. for(int j=1;j<=n;++j)
  22. if(j!=i&&B[j][i])
  23. for(int k=1;k<=n+1;++k)
  24. B[j][k]^=B[i][k];
  25. }
  26. for(int i=1;i<=n;++i) x[i]=B[i][n+1];
  27. }
  28. int main()
  29. {
  30. int pen=0;
  31. for(int i=1;i<=5;++i)
  32. for(int j=1;j<=6;++j)
  33. id[i][j]=++pen;
  34. scanf("%d",&T);
  35. for(int i=1;i<=T;++i)
  36. {
  37. memset(A,0,sizeof(A));
  38. for(int j=1;j<=5;++j)
  39. for(int k=1;k<=6;++k)
  40. {
  41. scanf("%d",&b[id[j][k]]);
  42. A[id[j][k]][id[j][k]]=1;
  43. }
  44. for(int j=1;j<=5;++j)
  45. for(int k=1;k<=6;++k)
  46. for(int l=0;l<4;++l)
  47. if(id[j+dx[l]][k+dy[l]])
  48. A[id[j][k]][id[j+dx[l]][k+dy[l]]]=1;
  49. Madoka();
  50. printf("PUZZLE #%d\n",i);
  51. for(int j=1;j<=5;++j)
  52. {
  53. for(int k=1;k<6;++k)
  54. printf("%d ",x[id[j][k]]);
  55. printf("%d\n",x[id[j][6]]);
  56. }
  57. }
  58. return 0;
  59. }

【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT的更多相关文章

  1. BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

    题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...

  2. UVA11542 Square(高斯消元 异或方程组)

    建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...

  3. Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】

    高斯消元. 自己只能想出来把每一个点看成一个变量,用Xi表示其状态,这样必定TLE,n^2 个变量,再加上3次方的高斯消元(当然,可以用bitset压位). 正解如下: 我们把地图划分成一个个的横条和 ...

  4. UVa 11542 (高斯消元 异或方程组) Square

    书上分析的太清楚,我都懒得写题解了.=_=|| #include <cstdio> #include <cstring> #include <cmath> #inc ...

  5. POJ.1830.开关问题(高斯消元 异或方程组)

    题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...

  6. UVA 11542 Square 高斯消元 异或方程组求解

    题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...

  7. 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树

    [题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...

  8. poj1830(高斯消元解mod2方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...

  9. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

  10. poj1222(枚举or高斯消元解mod2方程组)

    题目链接: http://poj.org/problem?id=1222 题意: 有一个 5 * 6 的初始矩阵, 1 表示一个亮灯泡, 0 表示一个不亮的灯泡. 对 (i, j) 位置进行一次操作则 ...

随机推荐

  1. mybatis 关系映射

    一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname ...

  2. 汕头市队赛 SRM 06 A 撕书

    A 撕书 SRM 06 背景&&描述 游行寺汀正在杀书.         书总共有n页,每页都可以看作是一个小写英文字母,所以我们可以把书看成长度为n的字符串s.         琉璃 ...

  3. 【BZOJ】1592: [Usaco2008 Feb]Making the Grade 路面修整

    [算法]动态规划DP [题解] 题目要求不严格递增或不严格递减. 首先修改后的数字一定是原来出现过的数字,这样就可以离散化. f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数 ...

  4. 文本区 JTextArea 的使用

    文本区JTextArea是对多行文本进行编辑的组件,用空字符来控制文本的格式.eg:"\n"为换行,"\t"为插入一个Tab字符. 文本去JTextArea的常 ...

  5. JSON的序列化和反序列化eval()和parse()方法以及stringfy()方法

    1.json解析的方法有两种:eval()和parse()方法 eval() 较危险,不光解析了字符串,还解析了js方法,无论何时用eval()都是非常危险的.-----不建议使用JSON.parse ...

  6. CSS3 渐变(Gradients)

    参考: http://www.runoob.com/css3/css3-gradients.html CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必 ...

  7. django unresolved template

    参考:https://stackoverflow.com/questions/8487410/pycharm-django-1-3-static-url-in-templates-unresolved ...

  8. python面向对象进阶(上)

    一 .isinstance(obj,cls)和issubclass(sub,super) (1)isinstance(obj,cls)检查对象obj是否是类 cls 的对象,返回True和Flase ...

  9. 如何开启SUSE Linux的SSH

    1. 使用命令行停止防火墙 /etc/init.d/SuSEfirewall2_init stop /etc/init.d/SuSEfirewall2_setup stop 2. 修改 vi /etc ...

  10. HDU1028 (整数拆分)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...