1622: 关灯游戏

内存限制:128 MB 时间限制:2.000 S
评测方式:文本比较 命题人:
提交:3 解决:1

题目描述

  “关灯”是近年来流行于 Internet 上的一个非常有趣的游戏. 定义如下, 给定一个 5×5 方格的棋盘, 如图 1. 1 所示, 每个方格有白色和黑色两种状态, 当鼠标点击其中任何一个方格时, 则使这个方格自身及与之相邻的上, 下, 左, 右四个方格都改变状态, 即原来是白色的则变为黑色(“关灯”之名由此而来) , 原来是黑色的则变为白色. 对于处于棋盘边缘的 16 个方格, 如图 1.2 所示, 它们的这四个邻居可能不全存在, 那么我们只考虑那些存在的方格.(此段介绍与下图都摘自于数学的实践与认识,第 37 卷第 11 期,《“关灯”游戏中的代数学》)
  从以上介绍我们可以发现对于方格 L(i,j) 来说,它最多只被按一次就可以了。因为按偶数次的效果等价于按 0 次的效果,而按奇数次的效果等价于按 1 次的效果。   同时我们发现,对于某一给定的初始局面,可能无解,即无论如何我们怎么按键,都不可能把所有的灯都关掉。   现在问题来了,对于给定的 M*N(M>0 && M<16 , N>0 && N<16)的初始化局面,1 表示灯是开着的,0 表示灯是关着的,我们要以最少的次数把所有的灯都关掉,如果可能就输出一个 M*N 的矩阵 S,S(i, j)=1 表示要把此处的灯按下,S(i,j)=0 表示此处的灯不要按下。如果不管怎么按,都不可能把所有的灯都关掉,就输出“IMPOSSIBLE”。

输入

  第一行,两个数字 M 和 N   下面是一个 M*N 的矩阵,每行有 N 个数字,描述灯的初始状态。1 表示灯是开着的,0 表示灯是关着的,中间用空格隔开。

输出

  如果存在最优解,就输出一个 M*N 的矩阵,每一行有 N 个数字,1 表示此处的灯需要按下,0 表示此处的灯不需要按下。如果不管怎么按都不可能把所有的灯都熄灭,就请输出“IMPOSSIBLE”。

样例输入 复制

样例输入1:
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1

样例输入2:
5 5
0 0 0 0 0
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 0 0 0

样例输出 复制

样列输出1:
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0

样例输出2:
IMPOSSIBLE

来源/分类