zoukankan      html  css  js  c++  java
  • 水壶问题

    365. 水壶问题

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

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

    你允许:

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

    示例 1: (From the famous "Die Hard" example)

    输入: x = 3, y = 5, z = 4
    输出: True
    

    示例 2:

    输入: x = 2, y = 6, z = 5
    输出: False
    

    分析一下x = 3, y = 5, z = 4的情况,最终需要4, 5-1=4,所以构造出一个1就可以,5-3=2,3-2=1

    1. x空,装满y
    2. y倒入x直到x装满,y剩下2
    3. x倒掉,y倒入x(此时x为2,y空)
    4. y装满,倒入x直到x满(此时x为3,y等于4)
    5. 倒出x
    # DFS  搜索操作:清空、装满、倒入
    def canMeasureWater(x,y,z):
        if x+y<z:
            return False
        if x ==0 or y == 0:
            return z == 0 or x+y == z
        stack = [(0,0)]#初始化x,y
        seen = set()
        while stack:
            remain_x,remain_y = stack.pop()
            if remain_x+remain_y == z:
                return True
            if (remain_x,remain_y) in seen:
                continue
            seen.add((remain_x,remain_y))
            stack.append((x, remain_y))# 把 X 壶灌满
            stack.append((remain_x, y))# 把 Y 壶灌满
            stack.append((0, remain_y))# 把 X 壶倒空
            stack.append((remain_x, 0))# 把 Y 壶倒空
            # 把 X 壶的水灌进 Y 壶,直至灌满或倒空
            stack.append((remain_x - min(remain_x, y - remain_y), remain_y + min(remain_x, y - remain_y)))
            # 把 Y 壶的水灌进 X 壶,直至灌满或倒空
            stack.append((remain_x + min(remain_y, x - remain_x), remain_y - min(remain_y, x - remain_x)))
        return False
    
    # BFS  搜索操作:清空、装满、倒入
    def canMeasureWater(x,y,z):
        if x+y<z:
            return False
        if x ==0 or y == 0:
            return z == 0 or x+y == z
        queue = [(0,0)]#初始化x,y
        seen = set()
        while queue:
            remain_x,remain_y = queue.pop(0)
            if remain_x+remain_y == z:
                return True
            if (remain_x,remain_y) in seen:
                continue
            seen.add((remain_x,remain_y))
            queue.append((x, remain_y))# 把 X 壶灌满
            queue.append((remain_x, y))# 把 Y 壶灌满
            queue.append((0, remain_y))# 把 X 壶倒空
            queue.append((remain_x, 0))# 把 Y 壶倒空
            # 把 X 壶的水灌进 Y 壶,直至灌满或倒空
            queue.append((remain_x - min(remain_x, y - remain_y), remain_y + min(remain_x, y - remain_y)))
            # 把 Y 壶的水灌进 X 壶,直至灌满或倒空
            queue.append((remain_x + min(remain_y, x - remain_x), remain_y - min(remain_y, x - remain_x)))
        return False
    
    #裴蜀定理
    def canMeasureWater(x,y,z):
        import math
        if x+y < z:
            return False
        if x ==0 or y == 0:
            return z == 0 or x+y == z
        return z%math.gcd(x,y) == 0
    
  • 相关阅读:
    classpath多个包添加
    不错的博客
    ARCGIS10.1 GeoDatabase深入理解:客户端连接与退出地理数据库时系统表的初始化
    ArcGIS Geodatabase版本控制机制的学习总结
    ARCGIS 10.1 发布服务问题以及注意事项汇总
    关于项目外包的一些总结
    ArcGIS与SuperMap的使用比较(1)
    [译]关于JavaScript 作用域你想知道的一切
    Apache 配置ArcGIS server/portal 反向代理
    arcgis server 无法手动删除切片
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12539082.html
Copyright © 2011-2022 走看看