美文网首页
LeetCode-python 365. 水壶问题

LeetCode-python 365. 水壶问题

作者: wzNote | 来源:发表于2022-11-16 00:03 被阅读0次

题目链接

难度:中等       类型: dfs


有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。

如果可以得到 targetCapacity 升水,最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。

你可以:

装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空

示例

输入: jug1Capacity = 3, jug2Capacity = 5, targetCapacity = 4
输出: true

解题思路


对于两个水壶x和y,只有6种操作:

  1. 把x清空
  2. 把y清空
  3. 把x装满
  4. 把y装满
  5. 把x里的水倒进y
  6. 把y里的水倒进x

尝试所有的排列组合,就知道能不能行

为了不重复搜索,记录下经历过的状态

代码实现

class Solution:
    def canMeasureWater(self, jug1Capacity: int, jug2Capacity: int, targetCapacity: int) -> bool:
        stack = [[0, 0]]
        visited = set()

        while stack:
            remain_x, remain_y = stack.pop()
            if remain_x == targetCapacity or remain_y == targetCapacity or remain_x + remain_y == targetCapacity:
                return True
            if (remain_x, remain_y) in visited:
                continue
            # 记录状态
            visited.add((remain_x, remain_y))

            # 所有有可能的操作
            stack.append((jug1Capacity, remain_y))
            stack.append((remain_x, jug2Capacity))
            stack.append((0, remain_y))
            stack.append((max(0, remain_x - (jug2Capacity - remain_y)), min(jug2Capacity, remain_y + remain_x)))
            stack.append((min(jug1Capacity, remain_y + remain_x), max(0, remain_y - (jug1Capacity - remain_x))))
        return False

模板2:

class Solution:
    def canMeasureWater(self, jug1Capacity: int, jug2Capacity: int, targetCapacity: int) -> bool:
         
        visited = set()

        def dfs(remain_x, remain_y):
            if (remain_x, remain_y) in visited:
                return False
            if remain_x == targetCapacity or remain_y == targetCapacity or remain_x + remain_y == targetCapacity:
                return True

            visited.add((remain_x, remain_y))

            if dfs(jug1Capacity, remain_y) or dfs(remain_x, jug2Capacity) or dfs(0, remain_y) or dfs(remain_x, 0) or dfs(max(0, remain_x - (jug2Capacity - remain_y)), min(jug2Capacity, remain_y + remain_x)) or dfs(min(jug1Capacity, remain_y + remain_x), max(0, remain_y - (jug1Capacity - remain_x))):
                return True
            return False

        
        return dfs(0, 0)

相关文章

  • LeetCode-python 365. 水壶问题

    题目链接[https://leetcode.cn/problems/water-and-jug-problem] ...

  • 365. 水壶问题

    【Description】有两个容量分别为 x升 和* y*升 的水壶以及无限多的水。请判断能否通过使用这两个水壶...

  • 365.水壶问题

    解题思路 裴蜀定理(或贝祖定理),说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为...

  • 365. 水壶问题

    题目 有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升...

  • leetcode 365. 水壶问题

    这道题我没有提交,原因是我还不能完全理解。

  • LeetCode 365. 水壶问题

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水...

  • LeetCode 365.水壶问题

    题目 水壶问题链接可能点不进去,所以我把完整的题目写在了下面。 分析 题意非常清晰,没有异议。对于示例 1我们可以...

  • 每日一题-leetcode 365. 水壶问题

    有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可...

  • 水壶问题

    题目: 题目的理解: 起初设想的解决方式:(1)x和y的相差,求得所有相差的值,即每一个值与所有的值相减,直到不会...

  • 水壶问题通解

    有两个容量分别为a升和b升的水壶以及无限多的水。请判断能否通过使用这个两个水壶,从而可以得到恰好z升的水?你允许进...

网友评论

      本文标题:LeetCode-python 365. 水壶问题

      本文链接:https://www.haomeiwen.com/subject/mfxyxdtx.html