avatar

Catalog
水壶问题

有两个容量分别为 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
Author: kim yhow
Link: http://yoursite.com/2020/03/21/水壶问题/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶