题目链接

题意:5*6矩阵中有30个灯,操作一个灯,周围的上下左右四个灯会发生相应变化 即由灭变亮,由亮变灭,如何操作使灯全灭?

题解:这个问题是很经典的高斯消元问题。同一个按钮最多只能被按一次,因为按两次跟没有按是一样的效果。那么 对于每一个灯,用1表示按,0表示没有按,那么每个灯的状态的取值只能是01。列出30个方程,30个变元,高斯消元解出即可。打表观察我们可以发现5*6的矩阵是一定有解的,主对角线元素都是1所以一定有唯一解。

打表代码:

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
char s[][];
int g[][],ans[];//注意这里定义的大小是n^2 不是n
int dir[][]= {{,},{,},{,-},{,},{-,}};
int n,m1,m2;
int gauss()
{
int row,col;
for(row=,col=; row<n&&col<n; col++) //注意是小于n
{
int id=row;
for(int i=row+; i<n; i++)
if(g[i][col]) id=i;
if(g[id][col])
{
for(int k=col; k<=n; k++)
swap(g[id][k],g[row][k]);//注意这里是k
for(int j=row+; j<n; j++)
if(g[j][col])
for(int k=col; k<=n; k++) //注意这里每段代码的特点 一点都不能写错
g[j][k]^=g[row][k];
row++;//一定注意这句话放到if里
}
}
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
printf("%d ",g[i][j]);
printf(" *******\n");
}
// for(int i=row; i<n; i++)
// if(g[i][n]) return -1;
// int ans=0;
// for(int i=n-1; i>=0; i--)
// {
// for(int j=n-1; j>i; j--)
// g[i][n]^=g[i][j]&&g[j][n];
// ans+=g[i][n];
// }
// return ans;
return -;
}
int main()
{ m1=;m2=;
n=m1*m2;
//
memset(g,,sizeof(g));
for(int i=; i<m1; i++)
for(int j=; j<m2; j++)
for(int k=; k<; k++)
{
int a=i+dir[k][];
int b=j+dir[k][];
if(a>=&&b>=&&a<m1&&b<m2)
g[a*m2+b][i*m2+j]=; //注意这里是 *m2, 模拟几个数就能理解了
}
int ans1,ans2;
ans1=gauss();
return ;
}

AC代码:

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int n=;
int f[][];
int g[][];
int dir[][]= {{,},{,},{,},{-,},{,-}};
void input()
{
for(int i=; i<; i++)
scanf("%d",&g[i][]);
}
void work()
{
int row,col;
for(row=,col=; row<n&&col<n; col++)
{
int id=row;
for(int i=id; i<n; i++)
if(g[i][col])
id=i;
if(g[id][col])
{
for(int k=col; k<=n; k++)
swap(g[row][k],g[id][k]);
for(int i=row+; i<n; i++)
if(g[i][col])
for(int k=col; k<=n; k++)
g[i][k]^=g[row][k];
row++;
}
}
//构建上三角完毕 下面开始回代过程
for(int i=n-;i>=;i--)
for(int j=n-;j>i;j--)
g[i][]^=g[i][j]&&g[j][];
//这一行可以参考传统的求解过程来理解
}
void print()
{
for(int i=; i<; i++)
{
if((i+)%!=)
printf("%d ",g[i][]);
else
printf("%d\n",g[i][]);
}
}
void debug()
{
for (int i =; i <; i++)
{
for (int j =; j <; j++)
cout <<""<< g[i][j];
cout << endl;
}
cout << endl;
}
int main()
{
for(int i=; i<; i++)
for(int j=; j<; j++)
for(int k=; k<; k++)
{
int a=i+dir[k][];
int b=j+dir[k][];
if(a>=&&b>=&&a<&&b<)
f[i*+j][a*+b]=;
}
int t,cas=;
scanf("%d",&t);
while(t--)
{
printf("PUZZLE #%d\n",cas++);
memcpy(g,f,sizeof(g));
input();
work();
print();
}
return ;
}

POJ 1222 EXTENDED LIGHTS OUT (高斯消元)的更多相关文章

  1. POJ 1222 EXTENDED LIGHTS OUT [高斯消元XOR]

    题意: $5*6$网格里有一些灯告诉你一开始开关状态,按一盏灯会改变它及其上下左右的状态,问最后全熄灭需要按那些灯,保证有解 经典问题 一盏灯最多会被按一次,并且有很明显的异或性质 一个灯作为一个方程 ...

  2. poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8481   Accepted: 5479 Description In an ...

  3. POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组

    http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...

  4. POJ 1222【异或高斯消元|二进制状态枚举】

    题目链接:[http://poj.org/problem?id=1222] 题意:Light Out,给出一个5 * 6的0,1矩阵,0表示灯熄灭,反之为灯亮.输出一种方案,使得所有的等都被熄灭. 题 ...

  5. POJ 1222 熄灯问题【高斯消元】

    <题目链接> 题目大意: 有一个5*6的矩阵,每一位是0或者1. 没翻转一位,它的上下左右的数字也为改变.(0变成1,1变成0).要把矩阵中所有的数都变成0.求最少翻转次数的方案,输出矩阵 ...

  6. [poj1222]EXTENDED LIGHTS OUT(高斯消元)

    题意:每个灯开启会使自身和周围的灯反转,要使全图的灯灭掉,判断灯开的位置. 解题关键:二进制高斯消元模板题. 复杂度:$O({n^3})$ #include<cstdio> #includ ...

  7. EXTENDED LIGHTS OUT (高斯消元)

    In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual ...

  8. POJ 1681---Painter's Problem(高斯消元)

    POJ   1681---Painter's Problem(高斯消元) Description There is a square wall which is made of n*n small s ...

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

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

随机推荐

  1. 【UEditor】 UEditor整合项目上传资源到阿里云服务器

    目录 关于此文 下载源码 JSP代码 Java代码 阿里云jar包引入配置 成功啦! 回到顶部 关于此文 项目中要实现编辑器生成带格式的html文档,存入模板,最后生成html的URL,所以选择了UE ...

  2. isNaN() 确认是否是数字

    isNaN(x): 当变量 x 不是数字,返回 true: 当变量 x 是其他值,(比如,1,2,3),返回false.

  3. 微信小程序未来怎么样?听微盟卫晓祥来说说

    微信小程序宣布公测已经一个多月了,开发者一片火热,未来会怎么样?听微盟卫晓祥来说说.微盟移动营销事业部总经理卫晓祥表示,微信小程序最吸引商户的地方在于:一方面小程序作为一种全新的连接用户与服务的方式, ...

  4. 使用 IntelliJ IDEA 导入 Spark源码及编译 Spark 源代码

    1. 准备工作 首先你的系统中需要安装了 JDK 1.6+,并且安装了 Scala.之后下载最新版的 IntelliJ IDEA 后,首先安装(第一次打开会推荐你安装)Scala 插件,相关方法就不多 ...

  5. struts2-(1)使用Filter作为控制器

    1.使用filter作为控制器 (1)创建类,实现javax.servlet.Filter package com.controller.filter; import java.io.IOExcept ...

  6. LazyLoad.js及scrollLoading.js

    http://blog.csdn.net/ning109314/article/details/7042829 目前图片延迟加载主要分两大块,一是触发加载(根据滚动条位置加载图片):二是自动预加载(加 ...

  7. jQuery中$(function(){})与(function($){})(jQuery)的区别

    首先,这两个函数都是在页面载入后执行的函数,其中两者的区别在于: 在jQuery中$(function(){})等同于jQuery(function(){}),另一个写法为jQuery(documen ...

  8. BZOJ2631——tree

    1.题目大意:bzoj1798的lct版本 2.分析:这个把线段树改成splay就好 #include <stack> #include <cstdio> #include & ...

  9. SSH-Struts第三弹:传智播客视频教程第一天上午的笔记

    一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...

  10. 剑指Offer 两个链表的第一个公共结点

    题目描述 输入两个链表,找出它们的第一个公共结点.   思路: 题目说的很笼统,应该是有2个链表,找出公共点,第一个公共点后面的链表是共同所有的.可以用map做,直接检测map里有没有出现这个节点. ...