【问题标题】:Self-Avoiding Walk using backtracking recursion [closed]使用回溯递归的自我避免行走[关闭]
【发布时间】:2012-06-19 18:40:10
【问题描述】:

给定:网格 m×n
我需要使用回溯和递归枚举所有不超过一个交叉点并且在右上角结束的路径!?有什么建议 。?
Self-Avoiding Walk

【问题讨论】:

  • 到目前为止你做了什么/尝试了什么?
  • 显而易见的起点是洪水填充风格的算法。选择一个起始方格(如果未指定)并将其标记为已使用,然后递归地尝试所有未标记为已使用的邻居。
  • 查找解迷宫算法。唯一的区别在于如何回答“我是否可以朝这个方向前进”的问题。
  • PS:如果您确实在某处找到了适合您click的代码,请在您的代码中添加注释,参考您在哪里了解到您需要什么。这是一个好习惯
  • 完成后我会放上我自己的代码。

标签: c recursion backtracking


【解决方案1】:

非递归方式是保留一堆以前的位置以及需要在该位置做出决定的信息。每次做出决定时,将需要保存的信息推送到堆栈顶部。

然后,当您的向前搜索发现问题时,它会弹出堆栈并跳回最近的决策点并做出不同的决策。最终你要么成功,要么把所有可能的路径都排除为不可能。

对于递归解决方案,它是相同的,除了不是将信息压入堆栈,而是在递归调用中做出决定后传递新位置。如果递归调用返回失败,则在当前位置尝试下一个可能的决定。如果您在当前位置没有选择,则将失败返回到上述级别。只有递归调用返回成功,此级别才会返回成功。

同样,最终在整个调用链上返回成功,或者消除所有可能的路径。

由于这是家庭作业,您必须自己决定哪些信息需要从一个级别传递到下一个级别,以及您的最终成功路径如何返回到应用程序。

您需要的所有新想法都在上面的段落中。实施仍取决于您。

-杰西

【讨论】:

  • +1 家庭作业问题的好答案。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
相关资源
最近更新 更多