所以水罐问题很出名。使用2罐容量a和b,产生体积d。水壶上没有标记。
所以我想尝试解决3罐容量a,b和c的问题。
以下代码显示了一个简单的问题的解决方案,其中水罐大小不一: 5、3和1,目标体积为4。我已列出所有可能的组合,以便程序可以尽可能通过StateStates进行操作,这仅仅是因为它可以更轻松地解释我遇到的问题。
因此,如果有空间等等,我的代码基本上只是将最大的水罐倒空为第二大水罐(对于较小的水罐,它首先向上工作,例如:如果5个空并且3个已满,则3个会变成5个) 。显然,尽管如此(如针对解决方案Solution for:(5,0,0)所示),这并不总是最好的方法。使用(5,0,0)的最佳方法实际上是将5清空为1。要获得4,将分两个步骤进行:(5,0,0)和(4,0,1)。
(5,3,0)给出正确答案的唯一原因是因为5不能倒入水罐2中,因此要尽可能多地倒入水罐1中。
我的问题是,如何编码三壶问题,以确保可以在下一步骤(4,0,1)中找到解决方案(5,0,0),而不是遍历(2,3,0) ).....?
事实是,我实际上有兴趣为任意数量的水罐编码解决方案,但无法从概念上确定如何做到这一点
请注意,我是一名初学者,对循环以外的功能了解不多。
global memory
global listSolution
capacity = (5,3,1)
#Set jug capacity
jug1Max = capacity[0]
jug2Max = capacity[1]
jug3Max = capacity[2]
def statusJugs(state):
#set jug status
jug1 = state[0]
jug2 = state[1]
jug3 = state[2]
if(jug1==4 or jug2==4 or jug3 ==4):
listSolution.append(state)
return True
#Has jug state been visited
if((jug1,jug2,jug3) in memory):
return False
memory[(jug1,jug2,jug3)] = 1
#empty jug1
if(jug1>0):
#empty jug1 into jug2
if(jug1+jug2<=jug2Max):
if(statusJugs((0,jug1+jug2,jug3))):
listSolution.append(state)
return True
else:
if(statusJugs((jug1-(jug2Max-jug2), jug2Max, jug3)) ):
listSolution.append(state)
return True
#empty jug1 into jug3
if(jug1+jug3<=jug3Max):
if( statusJugs((0,jug2,jug1+jug3))):
listSolution.append(state)
return True
else:
if( statusJugs((jug1-(jug3Max-jug3), jug2, jug3Max)) ):
listSolution.append(state)
return True
#empty jug2
if(jug2>0):
#empty jug2 into jug1
if(jug1+jug2<=jug1Max):
if( statusJugs((jug1+jug2, 0, jug3)) ):
listSolution.append(state)
return True
else:
if( statusJugs((jug1Max, jug2-(jug1Max-jug1), jug3)) ):
listSolution.append(state)
return True
#empty jug2 into jug3
if(jug2+jug3<=jug3Max):
if( statusJugs((jug1, 0, jug2+jug3)) ):
listSolution.append(state)
return True
else:
if( statusJugs((jug1, jug2-(jug3Max-jug3), jug3Max)) ):
listSolution.append(state)
return True
#empty jug3
if(jug3>0):
#empty jug3 into jug1
if(jug1+jug3<=jug1Max):
if( statusJugs((jug1+jug3, jug2, 0)) ):
listSolution.append(state)
return True
else:
if( statusJugs((jug1Max, jug2, jug3-(jug1Max-jug1))) ):
listSolution.append(state)
return True
#empty jug3 into jug2
if(jug2+jug3<=jug2Max):
if( statusJugs((jug1, jug2+jug3, 0)) ):
listSolution.append(state)
return True
else:
if( statusJugs((jug1, jug2Max, jug3-(jug2Max-jug2))) ):
listSolution.append(state)
return True
return False
possibleStates = [(5,3,1),(5,3,0),(5,0,1),(5,0,0),(0,3,1),(0,3,0),(0,0,1)]
for counter in range (0,len(possibleStates)):
listSolution = []
memory={}
initial_state = possibleStates[counter]
print("Solution for:",possibleStates[counter])
statusJugs(initial_state)
listSolution.reverse()
print (listSolution)
print ("Length of solution is:", len(listSolution))
print ("\n=======End of solution=======")
答案 0 :(得分:0)
在面向对象编程中,这将是一个非常好的练习。我建议您花一些时间来学习(使用Python)。如果做对了,您最终将得到更简单的代码,这些代码更易于检查和理解。祝你好运!