首先说什么是十字翻转棋,十字翻转棋又叫开窗游戏,游戏规则如下:
在n*n的方格中随机分布着一些关着的窗子,当你打开或关闭一个窗子时,它的上下左右四个方向的窗子开关状态也会翻转。目标是将这些关着的窗子都打开,游戏结束。
这里有一个我自己编写的html5开窗游戏,大家可以先去玩一下:
游戏相对还比较简单,只是一个3*3的难度,当游戏维度增加后,难度也会加大。下面我们来探讨一下如何快速找出一个最优解。
玩几次游戏发现如下两个规律:
1.任何一个位置我们点击1次和点击3次结果是相同的,因为每点一下,这个点击所影响的窗子是固定的,所以如果一个位置需要点击,我们只点击一下就可以了。
2.任何一个位置的窗子状态只和它上中下左右5个位置的点击状态有关系,和他们的点击顺序无关。
由1,2分析可知,在n*n的格子中,达到win状态时这n*n个格子每个格子只有是否被点击两种状态,而与达到这两种状态的点击次数无关,和点击顺序也无关。这个大家可以自己思考一下。
也就是说最后我们只需确定哪些格子需要点,哪些格子不需要点。
我们就拿3*3的难度来推理一下。
c1 | c2 | c3 |
c4 | c5 | c6 |
c7 | c8 | c9 |
假设格子的原始状态为 {cn}, cn有两个值 0代表开着的,1代表关着的 那么要把所有窗子都开着就是要把所有数字都变成0
x1 | x2 | x3 |
x4 | x5 | x6 |
x7 | x8 | x9 |