需要使用两把枪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。
程序中我哪里出错了,有什么方法可以解决这个问题?
答案 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的回答所解释的那样,如果你想要一个最佳的解决方案,你需要计算每个路径的长度并返回最小值。