深度优先搜索

题目见http://www.jzsyz.jzedu.cn/xxjs/Suanfa/commonalg/saosuo/chapter1.htm

有A、B、C、D、E 5本书,要分给张、王、刘、赵、钱5位同学,每人只能选1本。每个人都将自己喜爱的书填写在下表中。请你设计一个程序,打印出让每个人都满意的所有分书方案。

这道题目如何与深度优先搜索结合起来呢。可以看如下的图,1,A表示第一个人分配书A,那么之后存在4种情况,即为下图中的情况。图比较简略,有些没画,2,A 3,A 4,A 5,A的情况比较类似,就不画了。

通过这个图,就可以把所有的情况给穷举出来,可以看到通过深度优先搜索,从根节点到叶子节点,便是一个分配方案,在根据喜好进行剪枝,就可得到最终的分配方案。代码如下,用的是python3。

book = [0 for x in range(0,5)]
stack = []
ilike = [[0,0,1,1,0],[1,1,0,0,1],[0,1,1,0,0],[0,0,0,1,0],[0,1,0,0,1]]
count=0
def DFS(people):
    global count
    for x in range(0,5):
        if ilike[people-1][x] ==0 :
            continue
        if book[x]==0:
            book[x]=1
            stack.append(x)
            if people==5:
                print(stack)
                count=count+1
            else:
                DFS(people+1)
            book[x]=0
            stack.pop()
DFS(1)
print(count)
原文地址:https://www.cnblogs.com/cyttina/p/3061503.html