参考博客 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的时候,好吧说不太清楚,具体可以看代码。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath> using namespace std;
const int maxn=;
const int dx[]={,,,,-};
const int dy[]={,,-,,};
int a[maxn][maxn],ans[maxn];
int T,n,m;
void Gauss(){
int k,col;
for(k=,col=;k<n*m&&col<=n*m;k++,col++){
int i=k;
for(int j=k+;j<=n*m;j++){
if(fabs(a[j][col])>fabs(a[i][col]))i=j;
}
if(i!=k){
for(int j=;j<=n*m+;j++){
swap(a[k][j],a[i][j]);
}
}
if(a[k][col]==){
--col;
continue;
}
for(i=k+;i<=n*m;i++){
if(a[i][col]){
for(int j=;j<=n*m+;j++){
a[i][j]^=a[k][j];//是这样子吧?
}
}
}
}
for(int i=n*m;i>=;i--){
ans[i]=a[i][n*m+];
for(int j=i+;j<=n*m;j++){
ans[i]^=(ans[j]&&a[i][j]);
}
}
return;
}
int main(){
n=,m=;
scanf("%d",&T);
for(int t=;t<=T;t++){
memset(a,,sizeof(a));
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
int cnt=(i-)*m+j;
scanf("%d",&a[cnt][n*m+]);
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=;k<;k++){
int nx=i+dx[k];
int ny=j+dy[k];
if(nx>=&&nx<=n&&ny>=&&ny<=m){
int cnt=(i-)*m+j;
a[(nx-)*m+ny][cnt]=;
}
}
}
}
Gauss();
printf("PUZZLE #%d\n",t);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
int cnt=(i-)*m+j;
printf("%d ",ans[cnt]);
}
printf("\n");
}
}
return ;
}

【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. (QPS)TPS指标概述

    性能测试关注指标-TPS概述 一.TPS(Transaction per Second)定义 TPS是Transactions Per Second 的缩写,也就是事务数/秒.它是软件测试结果的测量单 ...

  2. 安装系统出现Winload.exe错误0xc000000e解决方法

    有的用户在安装Win7/Win8/Win10操作系统后,重启时出现Windows 启动管理器错误,无法加载所选项,因为应用程序丢失或损坏的的故障,错误代码:0xc000000e,这是由于引导文件没有正 ...

  3. Kafka之sync、async以及oneway

    kafka有同步(sync).异步(async)以及oneway这三种发送方式,某些概念上区分也可以分为同步和异步两种,同步和异步的发送方式通过“producer.type”参数指定,而oneway由 ...

  4. RK3288 指令查看HDMI当前分辨率和支持的分辨率

    $ adb shell root@xxx:/ # cd /sys/class/display/HDMI cd /sys/class/display/HDMI root@xxx:/sys/class/d ...

  5. GOF23设计模式之迭代器模式(iterator)

    一.迭代器模式概述 提供一种可以遍历聚合对象的方式.又称为:游标(cursor)模式 结构: (1)聚合对象:存储数据 (2)迭代器:遍历数据 二.迭代器模式示例代码 定义:正向遍历迭代器和逆向遍历迭 ...

  6. js正则验证

    /判断输入内容是否为空    function IsNull(){        var str = document.getElementById('str').value.trim();      ...

  7. sklearn中的predict与predict_proba的区别(得到各条记录每个标签的概率(支持度))

    假定在一个k分类问题中,测试集中共有n个样本.则: predict返回的是一个大小为n的一维数组,一维数组中的第i个值为模型预测第i个预测样本的标签: predict_proba返回的是一个n行k列的 ...

  8. 关于i++的解释

    根据 JavaScript Language Specification 的定义, 表达式 A=B的执行步骤,简单地说,就是:1. 对等号左边的表达式 A 进行计算,算出最终的结果,必须是参照或变量: ...

  9. 打开图片并显示在面板上demo

    import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...

  10. servlet对应.net中的http上下文

    java中的servlet在.net中其实就是http上下文.