题目链接

题意: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. WCF 已知类型和泛型解析程序 KnownType

    数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...

  2. java项目报junit 相关错误

    maven配置,java工程运行时需要把test测试相关移除

  3. UI第三节—— UITextField详解

    戏言:UITextField对于需要登陆注册的界面的作用还是相当明显,但是对于键盘过的遮挡问题,可是重点哦!这里就涉及到通知(NSNotificationCenter)的内容. //注册事件 [[NS ...

  4. oracle删除表以及清理表空间

    若要彻底删除表,则使用语句:drop table <table_name> purge; 清除回收站里的信息 清除指定表:purge table <table_name>; 清 ...

  5. Windows如何使用jstack跟踪异常代码

    维护服务器时,会出现java进程在CPU.内存.硬盘上总是出现异常情况. 如何找到是哪些代码出现这些异常呢? 本文使用jstack来实现这个需求 工具/原料   java jstack Process ...

  6. 全文检索引擎Solr系列——整合MySQL、MongoDB

    MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面 ...

  7. centos 6.5 zabbix3.0.4 监控apache

    开启apache的server-status httpd.conf 末尾添加 [root@test3 /]# vim /usr/local/httpd-/conf/httpd.conf Extende ...

  8. 导航栏的坑 (导航透明/导航除线/titleIView)

    //以下四个条件缺一不可 /.必须是半透明状态 self.navigationBar.translucent = YES; //2.导航栏背景图片为空图片 (不可以设置backgroundColor或 ...

  9. [POJ2109]Power of Cryptography

    [POJ2109]Power of Cryptography 试题描述 Current work in cryptography involves (among other things) large ...

  10. PHP四种基础算法详解

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...