如何找到最少的步数?
How to find the minimum number of moves?
注意:- 我已经用回溯方法解决了上述问题,通过尝试所有不同的方法,我正在寻找一种非常有效的方法 way/pattern。
我们得到一个大小为 'N' X 'N' 的棋盘。但它可以包含任意数量的 white-squares 和 black-squares ,也可以任意顺序。
假设有'a'-个白色方块和'b'-个黑色方块,那么,
[a+b=n*n]
我们要一直走棋盘上的黑方块,直到走不动为止。
这是一步中发生的事情:-
1)我们在坐标:-(row,column)处选择一个黑色方块并将其移动到(row-1,column+1),前提是坐标为(row-1,column +1) 还包含一个 black-square 。移动到新位置后,旧位置,即[行,列]变为空,即颜色变为白色。
或
2)我们在坐标:-(row,column)处选择一个黑色方块并将其移动到(row-1,column-1),只有当坐标为(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' 的棋盘和任何黑白方块的配置,如何找到以最少步数结束游戏的步数?
查看此问题的一种方法是图形遍历。由于我们正在寻找 最短 移动,我们可以利用我们的图遍历算法知识并考虑使用 breadth-first 遍历。
我们需要能够做几件事来实现这一点:
- 给定一个棋盘的某种配置,计算所有可以采取的合法走法。
- 给定一个棋盘的某种配置和一个合法的移动,计算应用该移动后棋盘的配置。
- 给定一个棋盘的某种配置,检查这个配置是否是终端(这样就不能从这个位置进行其他移动, 游戏结束)。
现在我们有了这个,让我们看看如何将这个问题映射到图遍历问题。
- 让初始配置成为图表的 root 节点。
- 引出根节点的边是我们可以从这个位置开始的合法移动。
- 这些边指向的children节点是将边标签上的移动应用到parent节点的配置。
然后寻找到终端位置的最短路径的过程如下所示(从根节点开始):
- 通过生成给定此配置的所有合法移动,扩展根节点的 children。
- 检查每个 children 以查看是否已达到终端配置。
- 如果不是,以breath-first的方式扩展children(BU的这个link有更多关于这种遍历的实现细节)
breath-first 遍历的魔力在这里发挥作用。从这里开始,我们重复扩展节点、检查终端配置以及如果找不到这样的配置则在图中向下一层的过程。
一旦找到终端配置,我们就知道从根节点(初始配置)到终端节点(游戏结束位置)的路径(表示移动的边)是最短的。我们现在要做的就是计算回到根节点的边数,我们就知道最小移动数是多少了。
注意:- 我已经用回溯方法解决了上述问题,通过尝试所有不同的方法,我正在寻找一种非常有效的方法 way/pattern。
我们得到一个大小为 'N' X 'N' 的棋盘。但它可以包含任意数量的 white-squares 和 black-squares ,也可以任意顺序。
假设有'a'-个白色方块和'b'-个黑色方块,那么,
[a+b=n*n]
我们要一直走棋盘上的黑方块,直到走不动为止。
这是一步中发生的事情:-
1)我们在坐标:-(row,column)处选择一个黑色方块并将其移动到(row-1,column+1),前提是坐标为(row-1,column +1) 还包含一个 black-square 。移动到新位置后,旧位置,即[行,列]变为空,即颜色变为白色。
或
2)我们在坐标:-(row,column)处选择一个黑色方块并将其移动到(row-1,column-1),只有当坐标为(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' 的棋盘和任何黑白方块的配置,如何找到以最少步数结束游戏的步数?
查看此问题的一种方法是图形遍历。由于我们正在寻找 最短 移动,我们可以利用我们的图遍历算法知识并考虑使用 breadth-first 遍历。
我们需要能够做几件事来实现这一点:
- 给定一个棋盘的某种配置,计算所有可以采取的合法走法。
- 给定一个棋盘的某种配置和一个合法的移动,计算应用该移动后棋盘的配置。
- 给定一个棋盘的某种配置,检查这个配置是否是终端(这样就不能从这个位置进行其他移动, 游戏结束)。
现在我们有了这个,让我们看看如何将这个问题映射到图遍历问题。
- 让初始配置成为图表的 root 节点。
- 引出根节点的边是我们可以从这个位置开始的合法移动。
- 这些边指向的children节点是将边标签上的移动应用到parent节点的配置。
然后寻找到终端位置的最短路径的过程如下所示(从根节点开始):
- 通过生成给定此配置的所有合法移动,扩展根节点的 children。
- 检查每个 children 以查看是否已达到终端配置。
- 如果不是,以breath-first的方式扩展children(BU的这个link有更多关于这种遍历的实现细节)
breath-first 遍历的魔力在这里发挥作用。从这里开始,我们重复扩展节点、检查终端配置以及如果找不到这样的配置则在图中向下一层的过程。
一旦找到终端配置,我们就知道从根节点(初始配置)到终端节点(游戏结束位置)的路径(表示移动的边)是最短的。我们现在要做的就是计算回到根节点的边数,我们就知道最小移动数是多少了。