三个杯子的倒水问题(BFS)
'''
已知容积为160 119 77的空桶和无限多的水
想要得到76升的水
问需要多少次操作?
'''
import numpy as np
visited = np.zeros((200,200,200))
class cup(object):
'''
定义量杯类
'''
def __init__(self,name,volume,MaxV):
self.name = name
self.MaxV = MaxV
self.volume = volume
A = 160
B = 119
C = 77
Result = 76
cupA = cup('A', 0, A)
cupB = cup('B', 0, B)
cupC = cup('C', 0, C)
def XpourWaterToY(cupX,cupY):
'''
把X中的水倒入Y中
:param CupX:
:param cupY:
:return: surplusX:X中的剩余量
surplusY:Y中的剩余量
'''
if cupX.volume >= cupY.MaxV-cupY.volume:
cupX.volume = cupX.volume - (cupY.MaxV-cupY.volume)
cupY.volume = cupY.MaxV
else:
cupY.volume = cupY.volume + cupX.volume
cupX.volume = 0
return cupX.volume,cupY.volume
def emptyWater(cupX):
'''
把X中的水清空,倒入水池中(不倒入任何容器)
:param cupX:
:return:
'''
cupX.volume = 0
return 0
def fillWater(cupX):
'''
将X倒满水
:param cupX:
:return:
'''
cupX.volume = cupX.MaxV
return cupX.volume
def show():
'''
当前三个水杯的状态
:return:
'''
return cupA.volume,cupB.volume,cupC.volume
class State:
def __init__(self,a,b,c,prev=None,step=0):
self.a = a
self.b = b
self.c = c
self .prev = prev
self.step = step
def bfs(cupA,cupB,cupC,Result):
queue = []
s = State(cupA.volume,cupB.volume,cupC.volume)
queue.append(s)
visited[0][0][0]=1
while queue:
statu = queue.pop(0)
flag = 1
while flag < 13:
cupA.volume = statu.a
cupB.volume = statu.b
cupC.volume = statu.c
a,b,c = 0,0,0
if flag == 1 :
emptyWater(cupA)
a,b,c = show()
if flag == 2:
emptyWater(cupB)
a,b,c = show()
if flag == 3:
emptyWater(cupC)
a,b,c = show()
if flag == 4:
fillWater(cupA)
a,b,c = show()
if flag == 5:
fillWater(cupB)
a,b,c = show()
if flag == 6 :
fillWater(cupC)
a,b,c = show()
if flag == 7:
XpourWaterToY(cupA,cupB)
a,b,c = show()
if flag == 8:
XpourWaterToY(cupB,cupA)
a,b,c = show()
if flag == 9:
XpourWaterToY(cupA,cupC)
a,b,c = show()
if flag == 10:
XpourWaterToY(cupC,cupA)
a,b,c = show()
if flag == 11:
XpourWaterToY(cupC,cupB)
a,b,c = show()
if flag == 12:
XpourWaterToY(cupB,cupC)
a,b,c = show()
if not visited[a][b][c]:
new_state = State(a,b,c,prev=statu,step=statu.step+1)
visited[a][b][c] = 1
queue.append(new_state)
if a == Result or b == Result or c == Result:
print("Find!")
return new_state
flag += 1
return None
def getPath(state):
path = []
while state.prev :
path.append(str(state.step)+' '+str((state.a,state.b,state.c)))
state = state.prev
return path[::-1]
def main():
'''
主函数
'''
reslut = bfs(cupA, cupB, cupC, Result)
path = getPath(reslut)
print('三个量杯最大容积为' + str((cupA.MaxV, cupB.MaxV, cupC.MaxV)))
print('目标水体积' + str(Result))
print('Path:' + '\n' + '共用了' + str(len(path)) + '步')
for i in path:
print(i)
if __name__ == '__main__':
main()