【问题标题】:Finding Reachable Destinations From Source从源头寻找可到达的目的地
【发布时间】:2021-07-07 00:31:18
【问题描述】:

我有一个非常有趣的问题,关于如何在给定最多只需要 n 次移动的源(起点)的情况下找到可到达目的地的列表。

【问题讨论】:

  • 简单的 BFS 可以解决这个问题。 stackoverflow.com/questions/2505431/…
  • 对于入门编程的初学者有没有办法做到这一点?我没学过 BFS 但这个问题是基于那门课程
  • 你有一个方便的邻接列表和广度优先搜索,限制级别的数量,因为移动的数量会解决你的问题。
  • 你能提供伪代码吗,因为我完全不知道如何应用 BFS 来解决这个问题,因为我正在学习编程并且从未在我的课堂上学习过这一点
  • 好的,我实现了 bfs,但是如何从起始位置跟踪深度级别?我可以向你展示我目前拥有的东西

标签: python algorithm dictionary


【解决方案1】:

通常 BFS 是用队列编写的,我认为这是不必要的,也有些混乱。我已经按照人们在图片中可能会想到的方式来编写它,并且边缘会逐步扩展。

def bfs(n, neighbors, source):
    fringe = [source]
    seen = dict()

    for i in range(n):
        next_fringe = []
        for u in fringe:
            for v in neighbors[u]:
                if v not in seen.keys():
                    next_fringe.append(v)
                    seen[v] = i + 1
        fringe = next_fringe

    return seen


source_destination = {"A": ["B", "D"], "B": ["C"], "C": ["D", "A"], "D": ["A"]}
print(bfs(3, source_destination, "A"))

这也记录了距离。我鼓励您仔细考虑这段代码以及为什么它是正确的!

【讨论】:

  • 例如 bfs(2, source_destination, "A"),我应该得到 ["A", "B", "C", "D"] 但我最终得到 [ “B”、“C”、“D”]。有没有办法解决这个问题?
  • 您提到“我的可到达目的地中没有包含源(起点)。”因此我添加了del seen[source]。您可以简单地删除此行。
  • 这个输出的原因是因为如果从“A”开始,最多只需要2步,那么可能的路径是:“A”->“B”->“C”和“ A”->“D”->“A”。现在在第二种情况下,我包含“A”,因为它是基于路径的可到达目的地(返回自身)。有点混乱
  • 明白了。在这种情况下,删除 del,并将 seen 的初始化替换为 set()。现在,源最初不会在那里,但您可以在稍后的时间点找到它。
  • 将看到的初始化替换为 set 和删除的 del 关键字时出现错误。您介意编辑您的帖子以了解您的意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2011-06-17
  • 1970-01-01
  • 2014-04-20
  • 2014-06-08
相关资源
最近更新 更多