Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的怪物头问题_Python_Shortest Path_Operations Research - Fatal编程技术网

Python中的怪物头问题

Python中的怪物头问题,python,shortest-path,operations-research,Python,Shortest Path,Operations Research,需要使用两把枪A和B来杀死一个怪物(有N个头)。当使用枪A时,它会砍下6个头,但如果怪物没有死亡(头数>0),它会长出3个头。当使用枪B时,它会砍下4个头,但如果怪物没有死,它会长出2个头。如果N

需要使用两把枪A和B来杀死一个怪物(有N个头)。当使用枪A时,它会砍下6个头,但如果怪物没有死亡(头数>0),它会长出3个头。当使用枪B时,它会砍下4个头,但如果怪物没有死,它会长出2个头。如果N<(枪可切割的枪头数量),则不能使用枪。如果N=-1,怪物和猎人都会死亡

问题要求找出是否有可能杀死怪物,猎人是否在杀死怪物时死亡,以及最短路径

我编写了以下Python程序来解决上述问题:

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,是显示的路径不正确。最好显示您得到的不正确输出,这样人们就可以解决这个问题,而不必自己运行程序。我没有意识到原始代码实际上是有效的!这是一个更好的答案(尽管我仍然会用不同的结构)。