设输入矩阵为A,输出矩阵为B,目标矩阵为C(零矩阵)。

方便起见,矩阵行列下标均从1开始。

考虑A矩阵元素a(i,j),B矩阵中与其相邻的元素 b(i,j),b(i - 1, j),b(i + 1,j),b(i,j - 1),b(i,j + 1) (#)。

有c(i,j)= 0 = a(i,j) ^ (∑ b(i,j) % 2)。

进一步有a(i,j) ^ 0 = a(i,j) = a(i,j) ^ a(i,j) ^ (∑ b(i,j) % 2) = ∑ b(i,j) % 2     (*)。

进一步考虑异或与模2加之间的关系:∑ b(i,j) % 2 = ^ B(i, j),其中B(i,j)表示(#)式5个元素的集合。

带入(*):^ B(i, j) = a(i,j)。这是我们需要的方程组。

(注:考虑边界上的元素,只需将不在矩阵范围内的b元素全部置零即可。)

将b(i,j)映射到x((i - 1) * 5 + j)(x下标从1到5 * 6)。

下面考虑解异或方程组AX= B。(与前面的表达无关)

a11 * x1 ^ a12 * x2 ^...^ a1n * xn = b1 ①

...

an1 * x1 ^ an2 * x2 ^...^ann * xn = bn ②

A,X,B均为0-1矩阵。

考虑消元,现在看系数矩阵A的第一列,若全部元素均为0,直接转到下一列,并且有方程组有多解。

若存在ai1 = 1,将其与第一行交换(这样做的目的是为了得到上三角阵)。

此时只需考虑剩余所有 1 < j ≤ n, 且aj1 = 1。有:

a11 * x1 ^ a12 * x2 ^...^ a1n * xn = b1 ①

aj1 * x1 ^ aj2 * x2 ^...^ ajn * xn = bj ②

① ^ ②:

(a11 * x1 ^ a12 * x2 ^...^ a1n * xn) ^ (aj1 * x1 ^ aj2 * x2 ^...^ ajn * xn) = b1 ^ bj。

即:(a11 * x1 ^ aj1 * x1) ^ (a12 * x2 ^ aj2 * x2) ^...^ (a1n * xn ^ ajn * xn) = b1 ^ bj 。

易于验证:a * x ^ b ^ x = (a ^ b) * x,因此进一步有:

(a11 ^ aj1)*x1 ^ (a12 ^ aj2)*x2  ^ .... ^ (a1n ^ ajn)*xn = b1 ^ bj 。

因而第j行x1的系数更新为1 ^ 1 即0 。

对增广阵如此消元至得到上三角阵即可得到答案。

http://poj.org/problem?id=1222

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxx = ;
  6. const int maxy = ;
  7. const int maxm = maxx * maxy;
  8. const int maxn = maxm + ;
  9. int A[maxn][maxn], B[maxn];
  10. int C[maxn][maxn];
  11. int dx[] = {, , , -, };
  12. int dy[] = {, -, , , };
  13. int pos(int i, int j) { return (i - ) * maxy + j; }
  14. bool in_range(int i, int j) { return i >= && i <= maxx && j >= && j <= maxy; }
  15. void solve(){
  16. memset(C, , sizeof C);
  17. for(int i = , k = ; i <= maxx; i++) for(int j = ; j <= maxy; j++, k++){
  18. //the k-th column of the coefficient matrix
  19. for(int u = ; u < ; u++){
  20. int nx = i + dx[u], ny = j + dy[u], p = pos(nx, ny);
  21. if(in_range(nx, ny)) C[k][p] = ;
  22. }
  23. C[k][maxm + ] = A[i][j];
  24. }
  25. for(int i = ; i <= maxm; i++){
  26. //eliminate for X(i)
  27. for(int j = i; j <= maxm; j++){
  28. //highlighting A[j][]
  29. if(C[j][i]){
  30. swap(C[i], C[j]);
  31. break;
  32. }
  33. }
  34. for(int j = i + ; j <= maxm; j++){
  35. if(!C[j][i]) continue;
  36. for(int k = i; k <= maxm + ; k++) C[j][k] ^= C[i][k];
  37. }
  38. }
  39. //retrieve the ans
  40. for(int i = maxm; i >= ; i--){
  41. B[i] = C[i][maxm + ];
  42. for(int j = i + ; j <= maxm; j++) if(C[i][j]) B[i] ^= B[j];
  43. }
  44. for(int i = ; i <= maxx; i++){
  45. printf("%d", B[pos(i, )]);
  46. for(int j = ; j <= maxy; j++){
  47. int p = pos(i, j);
  48. printf(" %d", B[p]);
  49. }
  50. printf("\n");
  51. }
  52. }
  53.  
  54. int main(){
  55. freopen("in.txt", "r", stdin);
  56. int T, kase = ;
  57. scanf("%d", &T);
  58. while(T--){
  59. printf("PUZZLE #%d\n", ++kase);
  60. for(int i = ; i <= maxx; i++) for(int j = ; j <= maxy; j++) scanf("%d", &A[i][j]);
  61. solve();
  62. }
  63. return ;
  64. }

poj1222 EXTENDED LIGHTS OUT的更多相关文章

  1. poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8481   Accepted: 5479 Description In an ...

  2. [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)

    题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...

  3. [Gauss]POJ1222 EXTENDED LIGHTS OUT

    题意:给一个5*6的矩阵 1代表该位置的灯亮着, 0代表该位置的灯没亮 按某个位置的开关,可以同时改变 该位置 以及 该位置上方.下方.左方.右方, 共五个位置的灯的开.关(1->0, 0-&g ...

  4. POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组

    http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...

  5. 【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT

    由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组: 引用题解: http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d2974452 ...

  6. [poj1222]EXTENDED LIGHTS OUT(高斯消元)

    题意:每个灯开启会使自身和周围的灯反转,要使全图的灯灭掉,判断灯开的位置. 解题关键:二进制高斯消元模板题. 复杂度:$O({n^3})$ #include<cstdio> #includ ...

  7. EXTENDED LIGHTS OUT poj1222 高斯消元法

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6443   Accepted: 42 ...

  8. POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)

    POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...

  9. uva 1560 - Extended Lights Out(枚举 | 高斯消元)

    题目链接:uva 1560 - Extended Lights Out 题目大意:给定一个5∗6的矩阵,每一个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,假设按了这个位置的开关,将会导致周围包含自 ...

随机推荐

  1. Java Socket常见异常处理 和 网络编程需要注意的问题

    在java网络编程Socket通信中,通常会遇到以下异常情况: 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发 ...

  2. RESTful架构详解(转)

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  3. [原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. android studio不能创建android项目,或者不能识别android项目的解决方法

    1.先点击file->close project回到android studio 欢迎界面,然后按如下图步骤添加相关的plugin就行了,然后重启. 2.如图 3. 4.

  5. 关于GridView只显示一样的问题

    如果GridView不管怎么改都只能显示一行的话,就重写GridView,自定义GridView: public class MyGridView extends GridView { public ...

  6. php中时间戳和日期格式的转换

    一,PHP时间戳函数获取指定日期的unix时间戳 strtotime(”2009-1-22″) 示例如下: echo strtotime(”2009-1-22″) 结果:1232553600 说明:返 ...

  7. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  8. Bootstrap布局设计

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. Oracle存储过程总结

    1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...

  10. 夺命雷公狗---node.js---10之POST的接收

    首先我们在项目下创建一个表单,代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta ...