1.链接地址:

http://bailian.openjudge.cn/practice/2811

http://poj.org/problem?id=1222

2.题目:

总时间限制:
1000ms
内存限制:
65536kB
描述
有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左 边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按 钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。


上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。对矩阵中的每盏灯设置一个初始状态。请你按按钮,直至每一盏等都熄灭。与一盏
灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。在下图中,第2行第3、5列的按钮都被按下,因此第2行、第4列的灯的状态就不改变。


你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭。根据上面的规则,我们知道1)第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。
因此,每个按钮最多只需要按下一次;2)各个按钮被按下的顺序对最终的结果没有影响;3)对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1
行的全部灯。如此重复下去,可以熄灭第1、2、3、4行的全部灯。同样,按下第1、2、3、4、5列的按钮,可以熄灭前5列的灯。

输入
第一行是一个正整数N,表示需要解决的案例数。每个案例由5行组成,每一行包括6个数字。这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。
输出
对每个案例,首先输出一行,输出字符串“PUZZLE #m”,其中m是该案例的序号。接着按照该案例的输入格式输出5行,其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。每个数字以一个空格隔开。
样例输入
2
0 1 1 0 1 0
1 0 0 1 1 1
0 0 1 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0
0 0 1 0 1 0
1 0 1 0 1 1
0 0 1 0 1 1
1 0 1 1 0 0
0 1 0 1 0 0
样例输出
PUZZLE #1
1 0 1 0 0 1
1 1 0 1 0 1
0 0 1 0 1 1
1 0 0 1 0 0
0 1 0 0 0 0
PUZZLE #2
1 0 0 1 1 1
1 1 0 0 0 0
0 0 0 1 0 0
1 1 0 1 0 1
1 0 1 1 0 1
来源
1222

3.思路:

枚举,按照程序设计导引及在线实践的思路

4.代码:

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> #define ARR_ROW_SIZE 5
#define ARR_COL_SIZE 6 using namespace std; int main()
{
int n;
cin>>n; bool arr_press[ARR_ROW_SIZE + ][ARR_COL_SIZE + ];
bool arr_press_save[ARR_ROW_SIZE + ][ARR_COL_SIZE + ];
bool arr_res[ARR_ROW_SIZE + ][ARR_COL_SIZE + ]; int i,j,k;
for(k = ; k <= n; ++k)
{
memset(arr_press,,sizeof(bool) * (ARR_ROW_SIZE + ) * (ARR_COL_SIZE + ));
for(i = ; i <= ARR_ROW_SIZE; ++i)
{
for(j = ; j <= ARR_COL_SIZE; ++j)
{
cin>>arr_press[i][j];
}
} memcpy(arr_press_save,arr_press,sizeof(bool)* (ARR_ROW_SIZE + ) * (ARR_COL_SIZE + )); memset(arr_res[],,sizeof(bool) * (ARR_COL_SIZE + ));
while()
{
for(i = ; i <= ARR_ROW_SIZE; ++i)
{
for(j = ; j <= ARR_COL_SIZE; ++j)
{
arr_press[i - ][j] ^= arr_res[i][j];
arr_press[i][j - ] ^= arr_res[i][j];
arr_press[i][j + ] ^= arr_res[i][j];
arr_press[i + ][j] ^= arr_res[i][j];
arr_press[i][j] ^= arr_res[i][j];
}
memcpy(arr_res[i+],arr_press[i],sizeof(bool) * (ARR_COL_SIZE + ));
}
for(i = ; i <= ARR_COL_SIZE; ++i) if(arr_press[ARR_ROW_SIZE][i]) break;
if(i > ARR_COL_SIZE) break;
else
{
memcpy(arr_press,arr_press_save,sizeof(bool) * (ARR_ROW_SIZE + ) * (ARR_COL_SIZE + ));
for(i = ARR_COL_SIZE; i >= ; --i)
{
if(!arr_res[][i]) break;
}
while(i <= ARR_COL_SIZE) {arr_res[][i] = !arr_res[][i];i++;}
}
}
cout<<"PUZZLE #"<<k<<endl;
for(i = ; i <= ARR_ROW_SIZE; ++i)
{
cout<<arr_res[i][];
for(j = ; j <= ARR_COL_SIZE; ++j)
{
cout<<" "<<arr_res[i][j];
}
cout<<endl;
}
} return ;
}

5.参考资料:

(1)程序设计导引及在线实践

OpenJudge 2811 熄灯问题 / 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),每次你可以把一个暗的点亮(或者亮的熄灭)然后它上下左右的灯也会跟着变化.最后让你把所有的灯熄灭,问你应该改变哪些灯. 首先我们可以发现 ...

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

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

  5. POJ 1222 EXTENDED LIGHTS OUT(反转)

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

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

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

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

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

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

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

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

随机推荐

  1. java异步任务处理

    1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...

  2. java实现生产者消费者问题

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  3. cocos2d-x中本地推送消息

    作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4038277.html  IOS下很简单: 添加一条推送 void PushNotific ...

  4. cdoj 92 Journey tarjan/lca 树上点对距离

    Journey Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/92 Descri ...

  5. Oracle 11g系统自己主动收集统计信息的一些知识

    在11g之前,当表的数据量改动超过总数据量的10%,就会晚上自己主动收集统计信息.怎样推断10%.之前的帖子有研究过:oracle自己主动统计信息的收集原理及实验.这个STALE_PERCENT=10 ...

  6. NodeJs + gm图片缩略图

    我的另一篇文章: Nginx/Apache图片缩略图技术 gm官网 1, 软件环境 nodejs npm GraphicsMagick or ImageMagick 貌似ImageMagick在处理大 ...

  7. Templates

    Templates Templates are the site's markup, where images and js, css files are located as well as the ...

  8. 【转】Singleton单例模式

    对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器. ...

  9. 明天参加GDG devfest

    明天就可以第二次去参加devfest了,还记得去年去的时候是个啥也听不懂的小白,希望今年能够收获更多,结识更多大牛和志同道合的伙伴.

  10. MSP430矩阵及独立键盘

    在学习MSP430的时候,总是有很多东西记不住,同时又是英文的资料,好多东西也是没怎么看透,英文虽过六级但是看英文资料还是有一种想睡的冲动啊,在学习键盘的时候,我的这块板子有些不同,矩阵键盘和独立键盘 ...