Python中的怪物头问题
需要使用两把枪A和B来杀死一个怪物(有N个头)。当使用枪A时,它会砍下6个头,但如果怪物没有死亡(头数>0),它会长出3个头。当使用枪B时,它会砍下4个头,但如果怪物没有死,它会长出2个头。如果N<(枪可切割的枪头数量),则不能使用枪。如果N=-1,怪物和猎人都会死亡 问题要求找出是否有可能杀死怪物,猎人是否在杀死怪物时死亡,以及最短路径 我编写了以下Python程序来解决上述问题:Python中的怪物头问题,python,shortest-path,operations-research,Python,Shortest Path,Operations Research,需要使用两把枪A和B来杀死一个怪物(有N个头)。当使用枪A时,它会砍下6个头,但如果怪物没有死亡(头数>0),它会长出3个头。当使用枪B时,它会砍下4个头,但如果怪物没有死,它会长出2个头。如果N
def A(heads, path):
if heads < -1:
path = []
return "Impossible to kill"
heads -= 6
path.append("A")
if heads == 0:
print path
path = []
return "Monster dies"
if heads == -1:
return "Both monster and human die"
heads += 3
if A(heads, path)=="Monster dies" or B(heads, path) == "Monster dies":
return "Monster dies"
def B(heads, path):
if heads < -1:
path = []
return "Impossible to kill"
#print "B", path, heads
heads -= 4
path.append("B")
if heads == 0:
print path
path =[]
return "Monster dies"
if heads == -1:
return "Both monster and human die"
heads += 2
if A(heads, path)=="Monster dies" or B(heads, path) == "Monster dies":
return "Monster dies"
print A(10, [])
defa(头部、路径):
如果磁头<-1:
路径=[]
返回“不可能杀死”
人头-=6
路径追加(“A”)
如果heads==0:
打印路径
路径=[]
返回“怪物死亡”
如果磁头==-1:
返回“怪物和人类同时死亡”
人头数+=3
如果A(头,路径)=“怪物死亡”或B(头,路径)=“怪物死亡”:
返回“怪物死亡”
def B(头部、路径):
如果磁头<-1:
路径=[]
返回“不可能杀死”
#打印“B”、路径、标题
人头-=4
路径追加(“B”)
如果heads==0:
打印路径
路径=[]
返回“怪物死亡”
如果磁头==-1:
返回“怪物和人类同时死亡”
人头数+=2
如果A(头,路径)=“怪物死亡”或B(头,路径)=“怪物死亡”:
返回“怪物死亡”
打印A(10,[])
样本数据(由问题提供):
对于N=10,最短路径为AAB
我在程序中哪里出错了?解决这个问题的更好方法是什么 我认为你需要把程序的结构设计得更好一点 也许可以为a和B创建一个函数,该函数获取头数,并在应用该函数后返回头数(枪+再生的效果) 将递归调用保留在单独的控制函数中;i、 不要让A和B自称 对于结束条件,使用枚举(或任何与python等价的东西)而不是字符串 我不清楚最终条件是否得到正确处理
更新-正如user695518的回答所解释的,如果需要最佳解决方案,您需要计算每个路径的长度并返回最小值。您正在搜索的路径不是最小的。您需要保存并检查路径的长度,如下所示:
def A(heads, path, path_len):
if heads < -1:
path = []
return float('inf') #Impossible to kill
heads -= 6
if heads < 0:
return float('inf')
path_len = path_len + 1
path.append("A")
if heads == 0:
print path
return path_len
heads += 3
return min(A(heads, path, path_len), B(heads, path, path_len))
def B(heads, path, path_len):
if heads < -1:
path = []
return float('inf') #Impossible to kill
heads -= 4
if heads < 0:
return float('inf')
path_len = path_len + 1
path.append("B")
if heads == 0:
print path
return path_len
heads += 2
return min(A(heads, path, path_len), B(heads, path, path_len))
A(10, [], 0)
defa(头部、路径、路径长度):
如果磁头<-1:
路径=[]
返回浮点('inf')#不可能杀死
人头-=6
如果磁头<0:
返回浮点('inf')
路径长度=路径长度+1
路径追加(“A”)
如果heads==0:
打印路径
返回路径
人头数+=3
返回最小值(A(头部,路径,路径长度),B(头部,路径,路径长度))
def B(头部、路径、路径长度):
如果磁头<-1:
路径=[]
返回浮点('inf')#不可能杀死
人头-=4
如果磁头<0:
返回浮点('inf')
路径长度=路径长度+1
路径追加(“B”)
如果heads==0:
打印路径
返回路径
人头数+=2
返回最小值(A(头部,路径,路径长度),B(头部,路径,路径长度))
A(10,[],0)
这是正确的答案。您可以使用全局变量来存储路径,而不是简单地打印路径?面试问题?你开发的解决方案遇到了什么问题?不是作业或面试问题:)只是引起了我的好奇心!!至于我面临的问题0,是显示的路径不正确。最好显示您得到的不正确输出,这样人们就可以解决这个问题,而不必自己运行程序。我没有意识到原始代码实际上是有效的!这是一个更好的答案(尽管我仍然会用不同的结构)。