EXTENDED LIGHTS OUT
题号:NC230527
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

在 Lights Out 游戏的扩展版本中,是一个有 5 行每行 6 个按钮的谜题(实际的谜题有 5 行每行 5 个按钮)。每个按钮都有一个灯。当按下按钮时,该按钮及其上方、下方、右侧和左侧的每个(最多四个)相邻按钮的灯状态会反转。 (如果打开,灯关闭;如果关闭,灯打开。)角落的按钮改变3个按钮的状态;边缘的按钮改变4个按钮的状态,其他按钮改变5个的状态。例如,如果按下下方左侧标记为X的按钮,则显示将变为右侧的图像。

游戏的目标是,从显示器上的任何一组初始灯开始,按下按钮使显示器进入所有灯都关闭的状态。当相邻按钮被按下时,一个按钮的动作可以撤销另一个按钮的效果。例如,在下面的显示中,按下左侧显示中标记为 X 的按钮会导致右侧显示。注意,第 2 行第 3 列和第 2 行第 5 列的按钮都改变了第 2 行第 4 列按钮的状态,所以最后,它的状态是不变的。

笔记:
1. 按下按钮的顺序无关紧要。
2. 如果第二次按下按钮,它会完全取消第一次按下的效果,因此不需要多次按下按钮。
3. 如第二张图所示,按下第二排对应的按钮,可以关闭第一排的所有灯。通过在每一行重复这个过程,第一行中的所有灯
可能会出现四行。类似地,通过按下第 2、3 列中的按钮,可以关闭前 5 列中的所有灯。
编写一个程序来解决这个难题。

输入描述:

输入的第一行是一个正整数 T,表示谜题个数。每个谜题将有5行,每行有6个数: 01,由一个空格分隔。 0 表示最初灯关闭,而 1 表示最初灯打开。

输出描述:

对于每个谜题,输出:
第一行带有字符串:“PUZZLE #m”,其中 m 表示第m个谜题。
在该行之后,是一个类似拼图的显示(与输入格式相同)。在这种情况下,1 表示必须按下才能解谜的按钮,而 0 表示未按下的按钮。在类似拼图的输出显示中,每个 01 之间应该正好有一个空格。
示例1

输入

复制
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

备注:

原题链接:http://poj.org/problem?id=1222