题意:给一个5*6的矩阵

1代表该位置的灯亮着, 0代表该位置的灯没亮

按某个位置的开关,可以同时改变 该位置 以及 该位置上方、下方、左方、右方, 共五个位置的灯的开、关(1->0, 0->1)

问能否将所有的灯关闭 若能 输出需要按哪些地方; 不能输出-1

高斯消元的入门题。

每个位置可以列出一个方程, 列出增广矩阵:

  每个位置可以形成增广矩阵的一行, 每行都有30个系数 分别代表(0到29号灯), 将 可以影响该位置改变的 位置(自己、上、下、左、右)对应的置1, 其余置0

  这样就形成了30*30的系数矩阵。

  将初始状态置入最后一列 就形成了增广矩阵

接下来只要解方程组即可。

化成约化阶梯后最后一列即为该方程组的解。

P.s. 需要注意的是:因为是矩阵表示的是灯的开关状态,所以解的过程中不应出现0、1以外的其余数字 即 01方程 用异或求解

  1. int a[][]; // 增广矩阵
  2. int x[]; // 解
  3. int free_x[]; // 标记是否为自由未知量
  4.  
  5. int n, m;
  6. void debug()
  7. {
  8. for(int i=;i<n*n;i++)
  9. {
  10. for(int j=;j<n*n;j++)
  11. printf("%d ", a[i][j]);
  12. printf("\n");
  13. }
  14. }
  15.  
  16. void Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
  17. {
  18. //转换为阶梯形式
  19. int col=, k, num=;
  20. for(k=;k<n && col<m;k++, col++)
  21. {//枚举行
  22. int max_r=k;
  23. for(int i=k+;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换
  24. if(abs(a[i][col])>abs(a[max_r][col]))
  25. max_r=i;
  26. if(max_r!=k)// 与第k行交换
  27. for(int j=col;j<m+;j++)
  28. swap(a[k][j], a[max_r][j]);
  29. if(!a[k][col])// 说明该col列第k行以下全是0了
  30. {
  31. k--;
  32. free_x[num++]=col;
  33. continue;
  34. }
  35. for(int i=k+;i<n;i++)// 枚举要删除的行
  36. if(a[i][col])
  37. for(int j=col;j<m+;j++)
  38. a[i][j]^=a[k][j];
  39. }
  40.  
  41. // debug();
  42. // printf("%d %d\n", col, k);
  43. //
  44. // for(int i=k;i<n;i++)
  45. // if(a[i][col])
  46. // return -1; // 无解
  47.  
  48. // if(k<m) //m-k为自由未知量个数
  49. // {
  50. // int stat=1<<(m-k);
  51. // int ans=INT_MAX;
  52. // for(int i=0;i<stat;i++)
  53. // {
  54. // int cnt=0;
  55. // for(int j=0;j<m-k;j++)
  56. // if(i&(1<<j))
  57. // {
  58. // x[free_x[j]]=1;
  59. // cnt++;
  60. // }
  61. // else
  62. // x[free_x[j]]=0;
  63. // for(int j=k-1;j>=0;j--)
  64. // {
  65. // int tmp;
  66. // for(tmp=j;tmp<m;tmp++)
  67. // if(a[j][tmp])
  68. // break;
  69. // x[tmp]=a[j][m];
  70. // for(int l=tmp+1;l<m;l++)
  71. // if(a[j][l])
  72. // x[tmp]^=x[l];
  73. // cnt+=x[tmp];
  74. // }
  75. // if(cnt<ans)
  76. // ans=cnt;
  77. // }
  78. // return ans;
  79. // }
  80. //
  81. // 唯一解 回代
  82. for(int i=m-;i>=;i--)
  83. {
  84. x[i]=a[i][m];
  85. for(int j=i+;j<m;j++)
  86. x[i]^=(a[i][j] && x[j]);
  87. }
  88. // int ans=0;
  89. // for(int i=0;i<n*n;i++)
  90. // ans+=x[i];
  91. // return ans;
  92. }
  93.  
  94. void init()
  95. {
  96. n=, m=;
  97. memset(a, , sizeof(a));
  98. memset(x, , sizeof(x));
  99. for(int i=;i<n;i++)
  100. for(int j=;j<m;j++)
  101. {
  102. int t=i*m+j;
  103. a[t][t]=;
  104. if(i>)
  105. a[(i-)*m+j][t]=;
  106. if(i<n-)
  107. a[(i+)*m+j][t]=;
  108. if(j>)
  109. a[i*m+j-][t]=;
  110. if(j<m-)
  111. a[i*m+j+][t]=;
  112. }
  113. }
  114.  
  115. int main()
  116. {
  117. int t, ca=;
  118. scanf("%d", &t);
  119. while(t--)
  120. {
  121. init();
  122. for(int i=;i<n*m;i++)
  123. scanf("%d", &a[i][n*m]);
  124. printf("PUZZLE #%d\n", ca++);
  125. Gauss(n*m, n*m);
  126. for(int i=;i<n;i++)
  127. for(int j=;j<m;j++)
  128. {
  129. printf("%d", x[i*m+j]);
  130. if(j==)
  131. printf("\n");
  132. else
  133. printf(" ");
  134. }
  135. }
  136. return ;
  137. }

POJ 1222

[Gauss]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. [poj1222]EXTENDED LIGHTS OUT(高斯消元)

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

  4. poj1222 EXTENDED LIGHTS OUT

    设输入矩阵为A,输出矩阵为B,目标矩阵为C(零矩阵). 方便起见,矩阵行列下标均从1开始. 考虑A矩阵元素a(i,j),B矩阵中与其相邻的元素 b(i,j),b(i - 1, j),b(i + 1,j ...

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

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

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

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

  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(反转)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12616   Accepted: 8 ...

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

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

随机推荐

  1. ASP根据IP来判断跳转页面

    真正IP的取得应该这样: 程序代码 ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") if ip = "" ...

  2. Jquery方法大全

    一.JQuery常用的方法 :(JQuery中90%都是方法,没有参数是获取,带参数是设置) $("#id").css('backgroundColor','blue'); .cs ...

  3. 我踩过的Alwayson的坑!(上集)

    最近被sql server Alwayson高可用组和读写分离,弄得神魂颠倒,身心俱疲.遇到了下面一些问题,提醒自己也给后来人做些记录. EntityFramework支不支持Alwayson? 起因 ...

  4. Scala语言初识

    scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让 ...

  5. web开发常用图片格式

    web开发常用图片格式有:gif   jpg/jpeg    png gif:图片压缩率高,可以显示动画,但是只能显示256色,可能造成颜色丢失. jpg:图片压缩率高(有损压缩),可以用小文件来显示 ...

  6. C#中的集合

    [集合不同于数组,是一组可变类型的.可变数量的元素的组合,这些元素可能共享某些特征,需要以某种操作方式一起进行操作.一般来讲,为了便于操作这些元素的类型是相同的] [集合与数组的区别:数组是连续的.同 ...

  7. 禁止button响应回车(.net页面)

    1. 深层次来说这不是 ASP.NET 的问题, 而是 html form 的 submit 按钮就是如何设计的. 当你的光标焦点进入某个表单元素的时候,会激活该表单中第一个(流布局顺从左到右,从上至 ...

  8. [.Net MVC] 使用 log4net 日志框架

    项目:后台管理平台 意义:项目开发中提出增加日志功能,对关键的操作.程序运行中的错误信息进行记录,这对程序部署后的调试有很大意义. 注:本文只是对网上搜集的信息进行了整合,以备今后查询. 关键字:.N ...

  9. 376. Wiggle Subsequence

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...

  10. [翻译][MVC 5 + EF 6] 8:更新相关数据

    原文:Updating Related Data with the Entity Framework in an ASP.NET MVC Application 1.定制Course的Create和E ...