如何找到最小移动量?

时间:2019-05-09 09:34:44

标签: chessboard.js

注意:-我已经通过回溯方法解决了上述问题,通过尝试各种方法,我正在寻找一种非常有效的方法/模式。

我们得到的棋盘大小为'N'X'N'。但是它可以包含任意数量的任意数量的白方块和黑方块。

假设有白色的'a'正方形和黑色的'b'正方形,然后,

[a + b = n * n]

我们必须继续在棋盘上用黑色方块移动,直到没有动静为止。

这是移动中发生的事情:-

1)仅在坐标为(row-1,column + 1)的情况下,我们才能在坐标:-( row,column)处选择一个黑色正方形并将其移至(row-1,column + 1) )还包含一个黑色正方形。将其移动到新位置后,旧位置(即[行,列])变空,即其颜色变为白色。

OR

2)仅在坐标为(row-1,column-1)的情况下,我们才能在坐标:-( row,column)处选择一个黑色正方形并将其移至(row-1,column-1)。 )还包含一个黑色正方形。将其移动到新位置后,旧位置(即[行,列])变空,即其颜色变为白色。

我们必须以最少的步数结束这场比赛,而问题是要找出这些步序。

让黑色正方形用“ 1”表示,白色正方形用“ 0” .....

示例:-

3X3棋盘:-

0 1 0

1 0 1

0 0 0

以最小移动次数结束游戏的移动顺序:-

1)将黑色正方形从[1,0]移到[0,1] ...现在,棋盘看起来像这样:-

0 1 0

0 0 1

0 0 0

2)我们将[1,2]处的黑色方块移至[0,1],棋盘如下所示:-

0 1 0

0 0 0

0 0 0

现在,没有有效的动作,游戏结束:-)

给定大小为'N'x'N'的棋盘,以及黑白正方形的任何配置,如何找到以最小移动次数结束游戏的移动顺序?

1 个答案:

答案 0 :(得分:0)

查看此问题的一种方法是遍历图。由于我们正在寻找最短动作,因此我们可以利用我们对图遍历算法的了解,并考虑使用广度优先遍历。

我们将需要做一些事情来实现这一目标:

  • 给出棋盘的某种配置,计算所有可以采取的合法举动
  • 给出棋盘的某种配置并进行合法移动,在应用该棋盘后计算棋盘的配置
  • 给出棋盘的某种配置,检查此配置是否为终端 (这样,从该位置开始无法进行其他任何动作,游戏结束)。

现在我们有了这个,让我们看看如何将这个问题映射到图遍历问题。

  • 让初始配置为图形的 root 节点。
  • 从根节点引出的 edges 是我们从该位置可以采取的合法措施。
  • 这些边缘指向的
  • 子节点是通过将边缘标签上的移动应用于父节点而产生的配置。

然后,找到到终端位置的最短路径的过程看起来像这样(从根节点开始):

  • 通过在给定此配置的情况下生成所有合法移动,来扩展根节点的子级。
  • 检查每个子级,以查看是否已达到终端配置。
  • 如果没有,则以呼吸优先方式扩展子级(BU的link详细介绍了此类遍历的实现细节)

呼吸优先遍历的魔力在这里开始。从这里开始,我们将重复此过程,以展开节点,检查终端配置,如果找不到这样的配置,则将其降到图中的某个级别。

找到终端配置后,我们知道从根节点(初始配置)到终端节点(游戏结束)的路径(代表所进行移动的边)是最短的 。现在,我们要做的就是计算返回到根节点的边的数量,并且知道最小移动量是多少。