DFS 获得所有可能的解决方案?

Posted

技术标签:

【中文标题】DFS 获得所有可能的解决方案?【英文标题】:DFS to get all possible solutions? 【发布时间】:2020-07-17 09:58:02 【问题描述】:

我有这些圈子:

我想获取最大不相交圆的所有可能解的列表。这是我想要从节点 A 获得的解决方案的插图。

因此来自节点 A 的可能解决方案: 1 = [A,B,C], 2 = [A,B,E], 3 = [A,C,B], 4 = [A,E,B] ..等等

我想将所有可能性存储到一个列表中,该列表将用于加权和选择最佳结果。但是,我仍在尝试创建所有可能性的列表。

我尝试在这里编写结构代码,但我仍然对回溯和递归感到困惑。有人可以帮忙吗?

# List of circle
# List of circle
list_of_circle = ['A','B','C','D','E']
# List of all possible solutions
result = []
# List of possible nodes
ways = []

for k in list_of_circle:
    if len(list_of_circle)==0:
        result.append(ways)
    else:
        ways.append[k]
        list_of_circle.remove(k)
        for j in list_of_circle:
            if k.intersects(j):
                 list_of_circle.remove(j)
return result

【问题讨论】:

[A, B, E], [A, E, B]?它应该重复一个结果吗? 是的,最后我不想要任何重复的结果。但是我认为排除重复的结果会变得更加复杂。因此,我将在存储在列表中后删除重复的。还是可以同时进行? 【参考方案1】:

这是一个可能的解决方案(伪代码)。

def get_max_non_intersect(selected_circles, current_circle_idx, all_circles):
    if current_circle_idx == len(all_circles):  # final case
        return selected_circles

    # we recursively get the biggest selection of circles if the current circle is not selected
    list_without_current_circle = get_max_non_intersect(selected_circles, current_circle_idx + 1, all_circles)

    # now we check if we can add the current circle to the ones selected
    current_intersects_selected = false
    current_circle = all_circles[current_circle_idx]
    for selected_circle in selected_circles:
        if intersects(current_circle, selected_circle):
            current_intersects_selected = true
            break

    if current_intersects_selected is true:  # we cannot add the current circle
        return list_without_current_circle
    else:   # we can add the current circle
        list_with_current_circle = get_max_non_intersect(selected_circles + [current_circle], current_circle_idx + 1, all_circles)
        return list_with_current_circle + list_without_current_circle
       

【讨论】:

以上是关于DFS 获得所有可能的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

BFS 和 DFS

深度优先搜索(DFS) — 20180926

dfs的几个基础示例

HDOJ5952Counting Cliques(团,dfs)

在不指定元素数量的情况下获得逻辑变量的所有可能组合[重复]

BZOJ1853 SCOI2010 幸运数字 DFS+容斥原理