破解编码专访第6版,8.2

时间:2015-09-21 21:08:36

标签: algorithm

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

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

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坐标对函数进行递归调用。

这似乎是一个非常简单的实现,但答案密钥有一个非常冗长和复杂的解决方案。任何人都可以向我解释为什么我的工作无效吗?

3 个答案:

答案 0 :(得分:1)

如果你有一个像这样的'地图'(其中|是路径而*是机器人最终的地方),那就行不通了。

   |
   |
   |
   *X
   XX

'机器人'会尽可能向下移动,然后无法向右移动,你的算法就会失败。

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

答案 1 :(得分:0)

易。大约10行代码,时间与行x列成比例。

定义:如果您可以从右下角到达,则单元格“正常”。在第一遍中,您确定所有细胞都很好。只需检查从上到下的行,从右到左的每行的列:如果它不是“禁止”,则单元格是正常的,如果它是右下角,或者如果它在上面或者是一个细胞的左边是好的。

如果左上角不好则有一个解决方案。否则,从左上角开始。只要你没有到达右下角,你就可以向下或向右转到一个很好的单元格。

答案 2 :(得分:0)

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