【问题标题】:Cracking the Coding Interview 6th Edition, 8.2破解编码面试第 6 版,8.2
【发布时间】:2015-09-21 21:08:36
【问题描述】:

问题状态:“想象一个机器人坐在网格的左上角,有 r 行和 c 列。机器人只能在 2 个方向上移动,向右和向下,但某些单元格是“禁区”,因此机器人不能踩到它们。设计一个算法来为机器人找到一条从左上角到右下角的路径。”

我的解决方案是执行以下操作:

while grid[r-1, c] !=null && grid[r-1][c] !=false
{
     moveRobotDown();
}
while grid[r, c-1] !=null && grid[r][c-1] !=false
{
     moveRobotRight();
}

----在两个 while 循环之后,我将使用新的 r,c 坐标对函数进行递归调用。

这似乎是一个非常简单的实现,但答案键有一个相当冗长和复杂的解决方案。谁能给我解释一下为什么我的不起作用?

【问题讨论】:

  • 如果在您的第​​一步中走下坡路会导致您陷入死胡同,什么时候会发生?您回溯并尝试另一条路线的逻辑在哪里?

标签: algorithm


【解决方案1】:

如果你有这样的“地图”(其中| 是路径,* 是机器人最终到达的地方),它就行不通了

   |
   |
   |
   *X
   XX

“机器人”将尽可能向下移动,然后无法向右移动,您的算法将失败。

我建议阅读树遍历,尤其是 A*

【讨论】:

  • 这个问题不需要 A*,因为它正在处理 DAG。
【解决方案2】:

简单。大约 10 行代码,时间与行 x 列成正比。

定义:如果您可以从它到达右下角,则该单元格是“好”的。在第一遍中,您确定所有正常的单元格。只需从上到下检查行,从右到左检查每行的列:如果一个单元格不是“禁区”,并且它要么是右下角,要么高于或高于一个很好的单元格的左侧。

如果左上角不好,那有办法解决。否则,从左上角开始。只要您还没有到达右下角,您就可以在每个转弯处向下或向右进入一个很好的单元格。

【讨论】:

    【解决方案3】:

    尝试使用 bfs 或 dfs。将此问题视为:从一个点到另一个点的最短路径。 使用递归和访问数组,即dfs可以快速解决这个问题。

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2017-08-31
      • 2012-09-24
      • 2018-11-21
      • 2013-09-05
      • 1970-01-01
      相关资源
      最近更新 更多