题目见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)