Poj 1222 EXTENDED LIGHTS OUT
题目大意:给你一个5*6的格子,每个格子中有灯(亮着1,暗着0),每次你可以把一个暗的点亮(或者亮的熄灭)然后它上下左右的灯也会跟着变化。最后让你把所有的灯熄灭,问你应该改变哪些灯。
首先我们可以发现,如果我们对一个灯操作2次,等于啥也没干,所以呢,每个点只有可能有两种状态,操作或不操作。
但是每个点的状态不只和自己有关,还与它周围的四个点有关,是吧?
所以相当于对于每个点解一个方程:
之前的状态 XOR 自己变没变 XOR 周围的四个点变没变 = 目标状态 (暗着)
稍稍变动一下,两边同时XOR之前的状态。
自己变没变 XOR 周围的四个点变没变 = 之前的状态
然后把所有点的异或方程合在一起,就得到了一个异或方程组。
解开这个方程组就大事告成了!
为了咱们解方程比较简单,我们可以在这个点的异或方程中,把影响到这个点的点的系数a记为1,不影响的记为0,将每个点是否操作作为所求的变量x1..n(n为点数),最终状态b作为方程的右边。
a1*x1 xor a2*x2 xor a3*x3 xor ... xor an*xn = b
其中a,x,b的取值都是1或0(ai的值表示是否对这个点有影响,b的值表示最后是否亮着,xi的值表示是否对点i进行操作),考虑完单个点的情况,再将所有点的方程加入:
a11*x1 xor a12*x2 xor a13*x3 xor ... xor a1n*xn = b1
a21*x1 xor a22*x2 xor a23*x3 xor ... xor a2n*xn = b2
... ... ... ...
an1*x1 xor an2*x2 xor an3*x3 xor ... xor ann*xn = bn
从而得到一个n*n的矩阵,再加上一列最终状态构成的列向量。
a11 a12 a13 ... a1n b1
a21 a22 a23 ... a2n b2
... ... ... ...
an1 an2 an3 ... ann bn
然后就是高斯消元时间啦!!——>见【高斯消元】
/*
Poj 1222
Author: Robert_Yuan
Memory: 364K
Time: 0MS
*/
#include<cstdio>
#include<cstring> using namespace std; #define maxn 32 int n,m;
int x[maxn];
int a[maxn][maxn];
int w[maxn][maxn]; //w[i][j] 表示 i,j是否能互相影响 void swap(int i,int j){
int t;
for(int k=i;k<=m*n+;k++)
t=w[i][k],w[i][k]=w[j][k],w[j][k]=t;
} void Xor(int i,int j){
for(int k=i;k<=m*n+;k++)
w[j][k]=w[j][k]^w[i][k];
} void print(){
for(int i=;i<=n*m;i++){
for(int j=;j<=m*n+;j++)
printf("%d ",w[i][j]);
printf("\n");
}
printf("\n\n");
} void gauss(){ //高斯消元 解 异或方程
//print(); for(int i=;i<=m*n;i++){
bool find=false;
for(int j=i;j<=m*n;j++)
if(w[j][i]){
swap(i,j);find=true;break;
}
if(!find) continue;
for(int j=i+;j<=m*n;j++)
if(w[j][i])
Xor(i,j);
} //print(); for(int i=m*n;i>=;i--){
x[i]=w[i][m*n+];
if(!x[i]) continue;
for(int j=i-;j>=;j--)
if(w[j][i])
w[j][m*n+]^=x[i];
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
printf("%d ",x[(i-)*m+j]);
printf("\n");
}
} void prework(){
n=,m=;
memset(w,,sizeof(w));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]),w[(i-)*m+j][m*n+]=a[i][j];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
w[(i-)*m+j][(i-)*m+j]=; //自己和上下左右是对自己有影响的点
if(j!=) w[(i-)*m+j][(i-)*m+j-]=;
if(j!=m) w[(i-)*m+j][(i-)*m+j+]=;
if(i!=n) w[(i-)*m+j][i*m+j]=;
if(i!=) w[(i-)*m+j][(i-)*m+j]=;
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("x.in","r",stdin);
freopen("x.out","w",stdout);
#endif
int T,cnt=;
scanf("%d",&T);
while(T--){
prework();
printf("PUZZLE #%d\n",++cnt);
gauss();
}
}
AC通道—> http://poj.org/problem?id=1222
Poj 1222 EXTENDED LIGHTS OUT的更多相关文章
- POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解
题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...
- POJ 1222 EXTENDED LIGHTS OUT(反转)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12616 Accepted: 8 ...
- poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)
http://poj.org/problem?id=1222 题意:给一个确定的5*6放入矩阵.每一个格子都有一个开关和一盏灯,0表示灯没亮,1表示灯亮着.让你输出一个5*6的矩阵ans[i][j], ...
- 【高斯消元】Poj 1222:EXTENDED LIGHTS OUT
Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each ...
- OpenJudge 2811 熄灯问题 / Poj 1222 EXTENDED LIGHTS OUT
1.链接地址: http://bailian.openjudge.cn/practice/2811 http://poj.org/problem?id=1222 2.题目: 总时间限制: 1000ms ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)
[题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...
- POJ 1222 EXTENDED LIGHTS OUT (熄灯问题)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8417 Accepted: 5441 Description In an ...
随机推荐
- 转载Mongondb
转自(http://blog.csdn.net/lchjustc/article/details/16988251) Mongodb调研 1. 调研目的 现在公司缺乏一个通用的key-value存 ...
- 初识 css3中counter属性
最近看到counter属性,好奇是做什么用的,于是去查了查. 1.简单介绍 counter是为css中插入计数器.[注明]在CSS2.1中counter()只能被使用在content属性上.关于浏览器 ...
- xcode4.5应用程序本地化
我们在开发一款APP的时候,总是会涉及应用程序国际化的事情,用ios里专业术语叫做本地化,其实都是一个意思,简而言之就是不同的系统语言,显示不同的应用名称.字符串名称.图片名称.等等,除了代码,ios ...
- linux积累
在多文件中批量替换字符串grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
- EmguCV学习——简单算法 差分与高斯
公司项目需要检测运动物体,我对opencv也没啥研究,google了好久看了好多方法,最简单的就是差分与高斯背景建模了. 旁边搞c++的同事正在搞更nb的算法,等出来了 我再转成C#版的分享. 先看差 ...
- wpf 动画 2个窗体切换
<Window x:Class="翻转.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xam ...
- (1)c语言学习总结之从关键字到循环结构
一.关键字和标示符 1.关键字:c规定的有特殊含义的单词(也就是系统起的名字),全部是小写,有32个; 由关键字引出数据类型和流程类型 1.分类: (1)数据类型:整型用int标示,字符型用char表 ...
- 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题
重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...
- chkconfig 命令详解
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--a ...
- iOS8 超简单的设置圆角按钮 ImageView等UIView
button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...