求解Whack-A-Mole的算法



问题如下:

  • 想象一下;"打鼹鼠";n x n棋盘上的游戏
  • 它有一个随机的初始条件,在这个条件下会弹出随机的摩尔
  • 在这个问题中,当你碰到一个摩尔时,这个摩尔和相邻的摩尔会发生变化(例如:如果相邻的摩尔是摩尔,它们就会变成空穴,如果它们是整体,它们就会成为摩尔(。你只能打鼹鼠,不能打洞(这与"熄灯"游戏不同(

目标是清除整个板,即不再留下痣。

我的问题是:

  • 多项式时间中有算法可以解决这个问题吗
  • 所有初始配置都可以解决吗

在传统的Lights Out中,我们可以使用GF(2(上的线性代数来找到最佳的移动集(我之所以说是集合,是因为我们从不重复移动,而且我们按什么顺序进行移动都无关紧要(。

在这里我们可以找到这个集合,但如果不进行修改,可能不可能启动。例如,在板上

..@@..
.@..@.
..@@..

我们想打中间的两个方块,但不能,因为它们都不在。相反,我们可以打其中一个在上的方块,打中间的方块,再次打第一个方块,然后打另一个中间的方块。

一般来说,给定我们在Lights Out中的一组移动,我们可以找到从一个正方形到一个移动的最短路径,按顺序点击最短路径然后反向(但只点击一次移动(。该算法是多项式时间,并表明在Lights Out中可解的每个配置在这里都是可解的。

例如,要解决

@@.
@@.
@..

我们必须为Lights Out找到一组动作(例如,使用追光方法(

@@. ...
@@. ...
@.. ...
.@. ...
... 1..
... ...
... ...
@@@ 12.
.@. ...
... ...
.@@ 12.
@.. 3..
... ...
..@ 12.
.@@ 34.
... ...
... 12.
... 345

然后重新排序并在命中洞的移动周围添加步骤

@@. ...
@@. 12.
@.. 345
.@. ...
... .2.
... 345
@.@ .X.
.@. .2.
... 345
@@@ .X.
@.@ ...
.@. 345
... ...
@@@ ...
.@. 345
... ...
@.@ ...
@.@ 3.5
... ...
..@ ...
.@@ ..5
... ...
... ...
... ...

我在这里使用正确的板来跟踪需要做的事情(熄灯动作的数字,临时动作的X(。

我不知道找到最短的解决方案有多难。

最新更新