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奋斗, ...
随机推荐
- 【bzoj1036】[ZJOI2008]树的统计Count
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- cf251.2.C (构造题的技巧)
C. Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabyt ...
- 【PHP面向对象(OOP)编程入门教程】6.如何去使用对象中的成员
上面看到PHP对象中的成员有两种一种是成员属性, 一种是成员方法.对象我们以经可以声明了,$p1=new Person(); 怎么去使用对象的成员呢?要想访问对象中的成员就要使用一个特殊的操作符”-& ...
- 软件测试-----Graph Coverage作业
/******************************************************* * Finds and prints n prime integers * Jeff ...
- 关于sql用<>不等于查询数据不对问题
平常查询数据 ' 当想要查询 不等于1 的数据的时候,一般会这样查询 ' 此处查询结果没查到所有想要的结果,如果night_flag 列数据为 null时,此行数据是查询不到的. 解决方法一: ' 解 ...
- HDU 1232 并查集/dfs
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...
- input注意事项
一.更改place-holder颜色 input::-webkit-input-placeholder { color: #D6D0CA !important; /* WebKit browsers ...
- Codeforce 287 div2 C题
题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...
- iOS开发——项目篇—高仿百思不得姐 05——发布界面、发表文字界面、重识 bounds、frame、scrollView
加号界面(发布模块) 一.点击加号modal出发布模块,创建控件,布局控件1)使用xib加载view,如果在viewDidLoad创建控件并设置frame 那么self.view 的宽高 拿到的是xi ...
- Linux的五个查找命令
1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...