参考博客 https://blog.csdn.net/so_so_y/article/details/76098713

题意

有一些灯泡组成了5*6的方阵。每个开关(开关会使灯泡的状态发生变化)除了控制它本身的灯泡以外,还同时控制上下左右四个方向的灯泡(如果有的话)。给出灯泡的初始状态,如果想吧所有的灯泡都关闭,应该按下哪些开关。0代表灯泡关闭,1代表灯泡打开。

分析

高斯消元解决开关问题的模板题。

这一类开关问题可以先转化为异或方程组,然后通过高斯消元解线性方程的方法进行求解。我们先来看一下该怎么转化。

它给出了初始的状态,我们把它看作一个n*m 01的矩阵L,开灯为1,关灯为0。那么目标状态也很明确,是一个n*m的全为0的矩阵。

每个开关控制的灯泡最多有五个(上下左右和它本身),我们把每个开关控制的灯泡都转换成矩阵,控制到的为1,没有控制到的为0。比如说如果灯泡组成的方阵使2*3的,那么一共有6个开关,每个开关所控制的矩阵(A1-A6)为

开关1:   1 1 0      开关5: 0 1 0   开关6:0 0 1

1 0 0                    1 1 1                0 1 1

每个开关只有两种状态,我们用1代表按下开关,0代表不安。开关的状态显然也是一个n*m的01矩阵,只不过是未知的(也是我们要求的)。

现在我们把上面这些状态通过异或组成方程

L xor A1*X xor A2*X xor A3 *X.....A6*X =0  注意:这里不是矩阵乘法,是点乘。

然后两遍同时异或L可以变成

A1*X xor A2*X xor A3*X ...A6*X=L

然后可以拆成

A1(1,1)*X(1,1) xor A2(1,1)*X(1, 2)....A6(1,1)*X(2,3)=L(1,1)

A1(5,6)*X(1,1) xor A2(5,6)*X(1,2)....A^(5,6)*X(2,3)=L(5,6)

现在我们就已经把题目转化为了一个线性的异或方程组。接下来通过高斯消元求解。

高斯消元求解异或方程组和求解普通方程组基本一样,就两个地方有一些区别。一个是消元的时候,普通方程组是将每个系数减去关键方程的系数和当前方程的比值和值的乘积(绕口令?),而异或方程组直接将每个系数和关键方程异或就好。另一个是回带求ans的时候,好吧说不太清楚,具体可以看代码。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8. const int maxn=;
  9. const int dx[]={,,,,-};
  10. const int dy[]={,,-,,};
  11. int a[maxn][maxn],ans[maxn];
  12. int T,n,m;
  13. void Gauss(){
  14. int k,col;
  15. for(k=,col=;k<n*m&&col<=n*m;k++,col++){
  16. int i=k;
  17. for(int j=k+;j<=n*m;j++){
  18. if(fabs(a[j][col])>fabs(a[i][col]))i=j;
  19. }
  20. if(i!=k){
  21. for(int j=;j<=n*m+;j++){
  22. swap(a[k][j],a[i][j]);
  23. }
  24. }
  25. if(a[k][col]==){
  26. --col;
  27. continue;
  28. }
  29. for(i=k+;i<=n*m;i++){
  30. if(a[i][col]){
  31. for(int j=;j<=n*m+;j++){
  32. a[i][j]^=a[k][j];//是这样子吧?
  33. }
  34. }
  35. }
  36. }
  37. for(int i=n*m;i>=;i--){
  38. ans[i]=a[i][n*m+];
  39. for(int j=i+;j<=n*m;j++){
  40. ans[i]^=(ans[j]&&a[i][j]);
  41. }
  42. }
  43. return;
  44. }
  45. int main(){
  46. n=,m=;
  47. scanf("%d",&T);
  48. for(int t=;t<=T;t++){
  49. memset(a,,sizeof(a));
  50. memset(ans,,sizeof(ans));
  51. for(int i=;i<=n;i++){
  52. for(int j=;j<=m;j++){
  53. int cnt=(i-)*m+j;
  54. scanf("%d",&a[cnt][n*m+]);
  55. }
  56. }
  57. for(int i=;i<=n;i++){
  58. for(int j=;j<=m;j++){
  59. for(int k=;k<;k++){
  60. int nx=i+dx[k];
  61. int ny=j+dy[k];
  62. if(nx>=&&nx<=n&&ny>=&&ny<=m){
  63. int cnt=(i-)*m+j;
  64. a[(nx-)*m+ny][cnt]=;
  65. }
  66. }
  67. }
  68. }
  69. Gauss();
  70. printf("PUZZLE #%d\n",t);
  71. for(int i=;i<=n;i++){
  72. for(int j=;j<=m;j++){
  73. int cnt=(i-)*m+j;
  74. printf("%d ",ans[cnt]);
  75. }
  76. printf("\n");
  77. }
  78. }
  79. return ;
  80. }

【POJ1222】EXTENDED LIGHTS OUT的更多相关文章

  1. 【POJ 1222】 EXTENDED LIGHTS OUT

    [题目链接] http://poj.org/problem?id=1222 [算法] 列出异或方程组,用高斯消元求解即可 [代码] #include <algorithm> #includ ...

  2. 【POJ】1222 EXTENDED LIGHTS OUT

    [算法]高斯消元 [题解] 高斯消元经典题型:异或方程组 poj 1222 高斯消元详解 异或相当于相加后mod2 异或方程组就是把加减消元全部改为异或. 异或性质:00 11为假,01 10为真.与 ...

  3. 【12c】扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE

    [12c]扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE 在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的 ...

  4. 【Silverlight】Bing Maps学习系列(六):使用扩展模式(Extended Modes)(转)

    [Silverlight]Bing Maps学习系列(六):使用扩展模式(Extended Modes) 微软Bing Maps推出有有段时间了,通过不断的改进和新的地图更新,现在已经基本上形成了一套 ...

  5. EXTENDED LIGHTS OUT poj1222 高斯消元法

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

  6. 【BZOJ】1770 [Usaco2009 Nov]lights 燈

    [算法]高斯消元-异或方程组 [题解]良心简中题意 首先开关顺序没有意义. 然后就是每个点选或不选使得最后得到全部灯开启. 也就是我们需要一种确定的方案,这种方案使每盏灯都是开启的. 异或中1可以完美 ...

  7. 【codeforces 29B】Traffic Lights

    [题目链接]:http://codeforces.com/problemset/problem/29/B [题意] 一辆车; 让从A开到B; 然后速度是v; (只有在信号灯前面才能停下来..否则其他时 ...

  8. 【四】搭建Markdown的编辑器

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  9. 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

随机推荐

  1. drone 学习二 pipeline 说明

    1. 基本语法 pipeline: backend: image: golang commands: - go build - go test frontend: image: node comman ...

  2. webpack 简单使用

    备注:  使用yarn 结合npm 模块进行简单项目开发 1. 安装 yarn init yarn add webpack --dev yarn global add live-server 2. 添 ...

  3. 常用ETL工具

    一 ETL工具[国外] 1. datastage点评:最专业的ETL工具,价格不菲,使用难度一般 下载地址:ftp://ftp.seu.edu.cn/Pub/Develop ... taStage.v ...

  4. 30个让人兴奋的视差滚动(Parallax Scrolling)效果网站--转

    视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验.作为今年网页设计的热点趋势,越来越多的网站应用了这项技术.今天这篇文章就与大 ...

  5. java web 程序---购物车选商品,购买,付款

    思路:1.有一个单选按钮,让我们选择商品   2.购买的物品及 数量清算 3.付款 我的界面: home.jsp <body> <center> 选择您购买的商品 <br ...

  6. Python GUI编程(Tkinter) windows界面开发

    Python实现GUI简单的来说可以调用Tkinter库,这样一般的需求都可以实现,显示简单的windows窗口代码如下: python_gui.py 1 #!C:\Python27\python.e ...

  7. ColorPic 一套簡單好用的顏色選擇器!

    做美工的時候,常常會有配色.抓取顏色及獲取顏色代碼的困擾,專業人士可能有很好的工具來協助,但對於偶爾需要或非經常接觸美工的人來說,即便是有很好的工具,也還要花很多時間進行學習,常常就是看到一個漂亮的顏 ...

  8. 第七章 伪分布式安装hive,sqoop

    第一部分:先讲这么去安装hive.先去hive官网下载,我这里以hive-0.12.0为例子. 前面第二章讲了安装hadoop,hbase实例,我们继续讲这么安装hive,先说下hive配置文件 一, ...

  9. limesurvey的问卷类型

  10. SVN的学习

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS 为什么需要SVN 通常软件开发由多人协作开发,如果对代码文件.配置文 ...