1

如果你不熟悉Knight's Travails,这里有一些背景知识。Knight's Travails和二叉搜索树

你的任务是建立一个功能knight_moves显示最简单的方式通过输出所有的广场骑士将沿途停在从一平方到另一个获得。

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

我被困在哪里是如何设置一个二叉树,或者,具体来说,骑士可以从当前位置做出的所有下一个可能的移动之间的关系是什么?

据我所知,BST的定义属性是树(及其任何子树和叶子)存储的键大于根节点的右侧,而较小的键存储在根节点的左侧。

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

如果在考虑BST键/值和定义父子关系时,提供的答案是更多的指导原则(哲学?),那将会更有价值。

谢谢。

+0

我刚刚注册了,这是我的第一个问题;请原谅我可能违反的任何公约。 –

+0

由于您没有发布过多的伪代码,因此我们可以提供的帮助有限。 – Prune

+0

我没有看到必要时给出伪代码,因为我实际上只是在寻找关于定义BST的键/值和父 - 子关系以及与Knight的Travails有关的观点。 你的帮助是足够的。谢谢。 但是,我仍然对上述BST的观点感到好奇__ –

回答

0

这不是BST问题。用回溯来攻击这个图形搜索问题。从学习和了解Dijkstra's algorithm开始,将板的正方形看作图中的节点。例如,a1连接到b3和c2;所有动作的成本都是1(这简化了算法)。

您需要在开始之前构建您的图形,连接所有可能的动作;或在飞行中,从当前广场生成所有可能性。大多数学生发现,在飞行中做起来更容易。

此外,从代数国际象棋符号改为(行,列)符号有所帮助。如果骑士是目前(行,列),然后是法律下一个动作是

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

...其中x和y都在0-7范围内(扔出去的是采取骑士过去举动板的边缘)。

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

这足以让你感动吗?

+0

谢谢。我遇到了这个想法。练习提示说:_尽量让所有可能的移动骑士可以作为一个树中的孩子。 我最初的方法(在寻找方向之前)是将每个可能的移动作为一个节点INSTEAD来处理每个正方形作为节点。每个移动(节点)都被认为是point_b,并且每个节点都有一个关联的point_a来表示它的原点(前一个位置)。 我能够得到它的工作,但某些坐标组合(原点,目标)导致堆栈溢出,而其他组合成功生成从a到b的路径。 –

+0

我所做的是根据位置生成possible_moves(节点)列表。然后我检查每个节点,看它是否包含目标点。如果没有,我将从possible_moves的第一个节点获取坐标,并生成一组新的possible_moves来扫描目标。我将它设置为广度优先搜索,因此它只在当前一代被检查后才填充新一代。 –

+0

然后我怀疑你的溢出问题是不修剪搜索的问题。生成所有“下一个”模板......但是如果您已经访问了一个正方形,或者已经在“待办事项”列表中,则不要再将其添加到“待办事项”列表中。这是Dijkstra算法的重要一点。 – Prune