POJ 1222 EXTENDED LIGHTS OUT (高斯消元)
题意:5*6矩阵中有30个灯,操作一个灯,周围的上下左右四个灯会发生相应变化 即由灭变亮,由亮变灭,如何操作使灯全灭?
题解:这个问题是很经典的高斯消元问题。同一个按钮最多只能被按一次,因为按两次跟没有按是一样的效果。那么 对于每一个灯,用1表示按,0表示没有按,那么每个灯的状态的取值只能是0或1。列出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 (高斯消元)的更多相关文章
- POJ 1222 EXTENDED LIGHTS OUT [高斯消元XOR]
题意: $5*6$网格里有一些灯告诉你一开始开关状态,按一盏灯会改变它及其上下左右的状态,问最后全熄灭需要按那些灯,保证有解 经典问题 一盏灯最多会被按一次,并且有很明显的异或性质 一个灯作为一个方程 ...
- poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8481 Accepted: 5479 Description In an ...
- POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组
http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...
- POJ 1222【异或高斯消元|二进制状态枚举】
题目链接:[http://poj.org/problem?id=1222] 题意:Light Out,给出一个5 * 6的0,1矩阵,0表示灯熄灭,反之为灯亮.输出一种方案,使得所有的等都被熄灭. 题 ...
- POJ 1222 熄灯问题【高斯消元】
<题目链接> 题目大意: 有一个5*6的矩阵,每一位是0或者1. 没翻转一位,它的上下左右的数字也为改变.(0变成1,1变成0).要把矩阵中所有的数都变成0.求最少翻转次数的方案,输出矩阵 ...
- [poj1222]EXTENDED LIGHTS OUT(高斯消元)
题意:每个灯开启会使自身和周围的灯反转,要使全图的灯灭掉,判断灯开的位置. 解题关键:二进制高斯消元模板题. 复杂度:$O({n^3})$ #include<cstdio> #includ ...
- EXTENDED LIGHTS OUT (高斯消元)
In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual ...
- POJ 1681---Painter's Problem(高斯消元)
POJ 1681---Painter's Problem(高斯消元) Description There is a square wall which is made of n*n small s ...
- POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...
随机推荐
- [译]Introducing ASP.NET 5
原文:http://weblogs.asp.net/scottgu/introducing-asp-net-5 ASP.NET 5预览版发布了, 可以在这下载最新的Visual Studio 2015 ...
- window8.1使用之快捷键
WIN键+? Win键——打开“开始”屏幕 Win+D——显示桌面 Win+E——打开计算机 Win+R——打开“运行”对话框 Win+L——锁定计算机 Win+M——最小化窗口 Win+方向键——窗 ...
- Ruby学习之mixin
直接上代码: module Action def jump @distance = rand(4) + 2 puts "I jumped forward #{@distance} feet! ...
- PHP简易聊天室&调试问题
在进入login.php程序之后 <?php error_reporting(E_ALL^E_NOTICE); session_start(); //装载Session库,一定要放在首行 $u ...
- lianjie
数值策划入门:如何确定游戏中的资源价值和定价http://bbs.gameres.com/thread_494366.html 一张常规的RPG游戏地图的制作流程 http://bbs.gameres ...
- linux 驱动程序中断号的申请
1.linux下查看硬中断与软中断 硬中断:/proc/interrupts 软中断:/proc/softirqs 往往一些硬件中断号都是跟CPU所分配的硬件中断号相匹配的. 即同类型的cpu可能对同 ...
- CentOS 6.5 3.0.4安装agentd
更改主机名为test3 [root@localhost ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=test3 关闭selinux [ ...
- Opencv角点检测
#include "stdafx.h" #define max_corners 20 int main() { int cornerNum = max_corners; vecto ...
- STM32通用定时器(转载)
STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...
- JavaScript深入浅出4-对象
慕课网教程视频地址:Javascript深入浅出 对象的结构:包含一系列无序的属性,每个属性都有字符串key和对应的值 创建对象:对象字面量.new/原型链.Object.create 对象的属性操作 ...