怪物在Python中遇到问题

时间:2011-09-13 14:48:19

标签: python shortest-path operations-research

需要使用两把枪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, [])  

示例数据(由问题提供): 对于N = 10,最短路径是AAB。

程序中我哪里出错了,有什么方法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您正在搜索不是最小的路径。您需要保存并检查路径的长度,如下所示:

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)

这给出了正确的答案。您可以使用全局变量来存储路径,而不是简单地打印它

答案 1 :(得分:0)

我认为你需要更好地构建程序。

也许为A和B创建一个函数,它接受头数并在应用函数后返回头数(枪械+再生效果)。

将递归调用保存在单独的控制函数中;即没有A和B自己打电话。

使用枚举(或等效的python)而非结束条件的字符串。

我不清楚是否正确处理了最终条件。

更新 - 正如user695518的回答所解释的那样,如果你想要一个最佳的解决方案,你需要计算每个路径的长度并返回最小值。