题目大意:给你一个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的更多相关文章

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

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

  2. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10835   Accepted: 6 ...

  3. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解

    题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...

  4. POJ 1222 EXTENDED LIGHTS OUT(反转)

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

  5. poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)

    http://poj.org/problem?id=1222 题意:给一个确定的5*6放入矩阵.每一个格子都有一个开关和一盏灯,0表示灯没亮,1表示灯亮着.让你输出一个5*6的矩阵ans[i][j], ...

  6. 【高斯消元】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 ...

  7. OpenJudge 2811 熄灯问题 / Poj 1222 EXTENDED LIGHTS OUT

    1.链接地址: http://bailian.openjudge.cn/practice/2811 http://poj.org/problem?id=1222 2.题目: 总时间限制: 1000ms ...

  8. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

    [题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...

  9. POJ 1222 EXTENDED LIGHTS OUT (熄灯问题)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8417   Accepted: 5441 Description In an ...

随机推荐

  1. 官网下载Spring dist

    新版Spring官网下载Spring的dist可真是麻烦 跟着下面的贴图走吧,有些在网页的下面,需要打开相应页面后往下拉拉. 下载完后解压lib里面就是各种jar包了 真是麻烦啊,不好找,不过Spri ...

  2. MVC5 Identity 自定义用户和角色

    看代码基本就都能看懂了,增加了两个用户详细信息的表,角色表增加两个字段页面中实现树形显示. //IdentityModels.cs using System.Data.Entity; using Sy ...

  3. nginx 解决400 bad request 的方法(转载)

    nginx的400错误比较难查找原因,因为此错误并不是每次都会出现的,另外,出现错误的时候,通常在浏览器和日志里看不到任何有关提示. 经长时间观察和大量试验查明,此乃request header过大所 ...

  4. PHP-Fcgi下PHP的执行时间设置方法

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误,原来PHP-Fcgi下的设置执行时间与isapi的不同     一般情况下设置PHP ...

  5. WIN10 64位下VS2015 MFC直接添加 halcon 12的CPP文件实现视觉检测

    近段时间开始接触halcon,但是在VS2015里面使用,无论是配置还是生产EXE文件,都不如意. 加上网上的教程很多,经过多次测试,其实有很多地方无需修改,如果修改的太多也失去了直接添加封装的意义. ...

  6. [terry笔记]物化视图 materialized view基础学习

    一.物化视图定义摘录:     物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...

  7. JavaScript 组件化开发之路(一)

    *:first-child{margin-top: 0 !important}.markdown-body>*:last-child{margin-bottom: 0 !important}.m ...

  8. 重命名Oracle数据库的表空间(Renaming a Tablespace)

    重命名一个表空间时,Oracle会在数据字典.控制文件和数据文件的头部更新这个表空间名. 注意,重命名一个表空间不会重命名相关联的数据文件. 重命名代码示例如下: SQL> alter tabl ...

  9. “Guess the number” game

    项目描述:https://class.coursera.org/interactivepython-004/human_grading/view/courses/972072/assessments/ ...

  10. jdbc 连接 oracle rac

    jdbc 连接 oracle rac 的连接串如下:   jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192. ...