带封闭格的无限网格骑士之旅

时间:2018-07-30 07:09:56

标签: algorithm breadth-first-search

最近一次采访中,有人问我这个问题:

  

在棋盘上有两个单元格,一个是起始单元格,另一个是   一个是目标单元格。您还将获得一个单元格列表,其中   代表被阻止的单元格,这意味着您不能掉落该单元格   在旅行中。现在您必须找到最少的步骤   骑士出发的目标格。鉴于   国际象棋网格是无限的。

所以我的想法是使用广度优先搜索,但是问题是,如果无法到达目的地,则代码将陷入无限循环。

如何解决?

2 个答案:

答案 0 :(得分:3)

鉴于只有有限的多个阻塞单元,如果两个单元之间无法相互访问,则其中一个单元必须仅具有有限的多个可达单元。

(否则,如果有两个无限大的区域,则该区域之间的“屏障”必须占据无限多个封闭单元)

现在解决方案非常明显。只需从源和目标进行并行BFS。如果任何一个搜索终止,则没有路径。

答案 1 :(得分:0)

您可以将木板限制为比起始单元格和目标单元格的最大坐标大3行3列的大小,即

rows = Max(starting cell row no + 3, destination cell row no + 3) 
cols = Max(starting cell column no + 3, destination cell column no + 3)

为什么?如果您考虑骑士的移动方式,您会发现您始终可以在棋盘的上述限制范围内以最小的移动次数到达任何距离单元。最“昂贵”的情况是将单元格对角对齐,例如从单元格A1和目标单元格B2开始,那么您需要前进C2,E3,C4,最后B2-4移动。所有其他情况都更快,所需的“空间”也更少。