Knight's Travails 和二叉搜索树

Knight's Travails and Binary Search Tree

如果您不熟悉 Knight's Travails,这里有一些背景信息。

Your task is to build a function knight_moves that shows the simplest possible way to get from one square to another by outputting all squares the knight will stop on along the way.

我知道在哪里可以找到此练习的完整解决方案,但我主要尝试自己完成它。

我卡住的地方是如何建立二叉树,或者,具体来说,骑士从其当前位置可以进行的所有下一步可能移动之间的关系是什么?

据我了解 BST,定义 属性 是树(及其任何子树和叶子)存储右侧根节点较大的密钥,左侧较小的密钥根节点。

如何表示骑士当前位置的值及其可能的(有效)移动?

在考虑 BST keys/values 和定义亲子关系时,如果提供的答案更像是一个指导原则(哲学?),那将更有价值。

谢谢。

这不是 BST 问题。将其作为具有回溯的图搜索问题进行攻击。从学习和理解 Dijkstra's algorithm 开始,将棋盘的正方形视为图中的节点。例如,a1 连接到 b3 和 c2;所有移动的成本都是 1(这稍微简化了算法)。

您需要在开始之前构建图表,连接所有可能的动作;或即时生成当前方块的所有可能性。大多数学生发现即时完成对他们来说更容易。

此外,从代数国际象棋符号更改为(行,列)符号也有帮助。如果马目前在(行,列),那么合法的下一步是

(row+-2, col +-1) and
(row+-1, col +-2)

... 其中 x 和 y 都在 0-7 范围内(抛出让骑士越过棋盘边缘的动作)。

维护您已经访问过的方块的全局列表,以及您需要访问的另一个方块(从您访问过的那些方块开始移动)。您还需要一组最低成本(移动次数)才能到达每个方块。将其初始化为 100,并让算法在搜索过程中减少它。

这足以让你动起来吗?