有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空
思路
使用广度遍历,将所有可能的情况都遍历一遍,结束条件,同时需要有一个集合控制,存放某个状态是否出现过。
一开始写的时候,总是将结束条件放在程序里面判断,应该要放在最前面判断
class Solution:
def canMeasureWater(self, x: int, y: int, z: int) -> bool:
xx = 0
yy = 0
self.states = [(xx, yy)]
self.seen = set()
while self.states:
xx , yy= self.states.pop()
if xx==z or yy == z or xx + yy == z:
return True
if (xx, yy) in self.seen:
continue
self.seen.add((xx, yy))
# xx 灌满水
self.states.append((x, yy))
# xx 水倒光
self.states.append((0, yy))
# xx 水倒入yy,判断xx能否倒空,或者yy灌满
if xx+yy > y:
self.states.append((xx+yy - y, y))
else:
self.states.append((0, xx+yy))
# yy 灌满水
self.states.append((xx, y))
# yy 水倒光
self.states.append((xx, 0))
# yy 水倒入xx,判断yy能否倒空,或者xx灌满
if xx+yy > x:
self.states.append((x, xx+yy - x))
else:
self.states.append((xx+yy, 0))
return False