【POJ1222】EXTENDED LIGHTS OUT
参考博客 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的更多相关文章
- 【POJ 1222】 EXTENDED LIGHTS OUT
[题目链接] http://poj.org/problem?id=1222 [算法] 列出异或方程组,用高斯消元求解即可 [代码] #include <algorithm> #includ ...
- 【POJ】1222 EXTENDED LIGHTS OUT
[算法]高斯消元 [题解] 高斯消元经典题型:异或方程组 poj 1222 高斯消元详解 异或相当于相加后mod2 异或方程组就是把加减消元全部改为异或. 异或性质:00 11为假,01 10为真.与 ...
- 【12c】扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE
[12c]扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE 在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的 ...
- 【Silverlight】Bing Maps学习系列(六):使用扩展模式(Extended Modes)(转)
[Silverlight]Bing Maps学习系列(六):使用扩展模式(Extended Modes) 微软Bing Maps推出有有段时间了,通过不断的改进和新的地图更新,现在已经基本上形成了一套 ...
- EXTENDED LIGHTS OUT poj1222 高斯消元法
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6443 Accepted: 42 ...
- 【BZOJ】1770 [Usaco2009 Nov]lights 燈
[算法]高斯消元-异或方程组 [题解]良心简中题意 首先开关顺序没有意义. 然后就是每个点选或不选使得最后得到全部灯开启. 也就是我们需要一种确定的方案,这种方案使每盏灯都是开启的. 异或中1可以完美 ...
- 【codeforces 29B】Traffic Lights
[题目链接]:http://codeforces.com/problemset/problem/29/B [题意] 一辆车; 让从A开到B; 然后速度是v; (只有在信号灯前面才能停下来..否则其他时 ...
- 【四】搭建Markdown的编辑器
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
随机推荐
- 13 Stream Processing Patterns for building Streaming and Realtime Applications
原文:https://iwringer.wordpress.com/2015/08/03/patterns-for-streaming-realtime-analytics/ Introduction ...
- [LeetCode系列]链表环探测问题II
给定一个链表头, 探测其是否有环, 如果没有返回NULL, 如果有返回环开始的位置. 环开始的位置定义为被两个指针指向的位置. 算法描述: 1. 快慢指针遍历, 如果到头说明无环返回NULL, 如果相 ...
- Oracle 块修改跟踪 (Block Change Tracking) 说明
Block ChangeTracking 是Oracle 10g里推出的特性.官网对Block change tracking 的定义如下: Adatabase option that causes ...
- Oracle在线新增索引
Oracle新增索引语法很简单,如果是普通索引的话: create Index IDX_T_WLF on T_WLF(ACTIVITYID,ACTIVETIME) tablespace TBS_VCO ...
- Request.UrlReferrer详解
使用前需要进行判断: if (Request != null && Request.UrlReferrer != null && Request.UrlReferrer ...
- GOF23设计模式之原型模式(prototype)
一.原型模式概述 1.通过new产生一个对象需要非常繁琐的数据准备和访问权限,则可以使用原型模式. 2.就是java中的克隆技术,以某个对象为原型,复制出新的对象,显然,新的对象具备原型对象的特点. ...
- Charles修改返回值的方法(构造返回值最大值的情况,比如100,99) (自己没有试过)
第一步:save respond到电脑 第二步:打开文件,修改相应的参数 第三步:导入修改后的文件 第四步:手机刷新数据,查看结果
- Linux下干净卸载mysql详解
转自:http://blog.csdn.net/tjcyjd/article/details/52189182 1.使用以下命令查看当前安装mysql情况 rpm -qa|grep -i mysql ...
- Oracle段高水位(HWM, high water mark)问题
Oracle对表做全表扫描的时候 ,会扫描完HWM以下的数据块.如果某个表delete(delete操作不会降低高水位)了大量数据,那么这时对表做全表扫描就会做很多无用功,扫描了一大堆数据块,最后发现 ...
- OD 实验(九) - 对一个程序的破解
程序: 运行程序 点击 About 这是要注册的 点击 Register 输入邮箱和注册码,点击 Register Now 逆向: 用 OD 打开程序 右键 -> 查找 -> 所有参考文本 ...