Python|利用BFS模板解决水壶问题

简介: Python|利用BFS模板解决水壶问题

问题描述

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

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

你允许:

装满任意一个水壶;

清空任意一个水壶;

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

解决方案

这道题转化为数学方法就是nx+my=z的问题,有一个数学定理叫贝祖定理:

如果x,y的最大公约数为k那么一定存在两个整数ab满足ax+by=k

如果z%k=0就一定存在一个整数G,满足G(ax+by)=Gk=z,即得到Gax+Gby=z。

满足条件,所以这道题就简化成求xy的最大公约数。

一、数学方法解决

import math

def canMeasureWater(x,y,z):

    #首先处理几种极端情况

    if x+y<z:

        return False

    elif z==x or z==y:

        return True

    elif x==0 or y==0:

        return False

    #判断z是否能整除最大公约数

    return z%math.gcd(x,y)==0    #math.gcd()这个函数就是直接求出参数的最大公约数

#也可以用辗转相除法自己求最大公约数

def mygcd(x,y):

    while y:

        x,y=y,x%y

    return x

二、用BFS模板来求解

1.建立BFS模板

(1)建立queuevisited set;

(2)while queue 不空:

(3)处理当前节点;

(4)扩展节点,更新visited,入queue。

2.BFS在python的模板

def BFS(graph,start,end):

    queue=[]#建立queue

queue.append([start])

Visited=set()#建立visited

    visited.add(start)

    while queue:#循环queue

        node=queue.pop()#处理节点

        visited.add(node)#更新visited

        process(node)

        nodes=generate_related_nodes(node)#扩展节点

        queue.push(nodes)#queue

3.本题带入

主要是模拟倒水的情况用BFS暴力枚举。

import collections

class Solution:

    def canMeasureWater(self, x: int, y: int, z: int) -> bool:

        # 首先处理几种极端情况

        if z<0 or x+y<z:return False

        # BFS

        queue=collections.deque([(0,0)])#建立queuecollections.deque双端队列,支持从两端添加和删除元素

        visited={(0,0)}         #建立visited

        while len(queue):

            # current node processing处理当前节点

            a,b=queue.popleft()

            if a==z or b==z or a+b==z:

                return True

            #generate other nodes扩展更多节点

            states=self._gen_states(a,b,x,y)

            # check visited push node 更新visited 提交节点

            for state in states:

                if state not in visited:

                    visited.add(state)

                    queue.append(state)

        return False

    def _gen_states(self,a,b,x,y):

        states=[]

        #清空

        states.append((0,b))

        states.append((a,0))

        #填满水

        states.append((x, b))

        states.append((a, y))

        #a倒入ba+b

        if a+b<y:

            states.append((0,a+b))

        else :

            states.append((a+b-y,y))

        #b倒入aa+b

        if a+b<x:

            states.append((a+b,0))

        else:

            states.append((x,a+b-x))

        return states

# sol=Solution()

# print(sol.canMeasureWater(3,5,4))

结语

对比两种方法的代码量明显可以看出这道题的优质算法是用数学方法解决,之所以用BFS来解决,主要是为了熟练运用BFS模板来嵌套解决,方便以后遇到数学方法不是很容易想出来,必须要用到这种搜索算法来暴力枚举(模拟),当熟练掌握了这个模板并加以运用就可以很快的写出BFS算法相关的题了。

目录
相关文章
|
1月前
|
程序员 Linux Python
python中模板和包的使用
本文介绍了 Python 模块和包的基本概念及使用方法。模块是 Python 程序结构的核心,每个以 `.py` 结尾的源文件都是一个模块,包含可重用的代码。文章详细讲解了模块的导入方式(如 `import` 和 `from...import`),模块的搜索顺序,以及如何创建和发布自己的模块。此外,还介绍了包的概念,包是包含多个模块的特殊目录,并通过 `__init__.py` 文件定义对外提供的模块列表。最后,文章简述了如何使用 `pip` 工具管理第三方模块的安装与卸载。作者:大石头的笔记;来源:稀土掘金。
|
2月前
|
Python
Seaborn 教程-模板(Context)
Seaborn 教程-模板(Context)
57 4
|
3月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
44 2
|
3月前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
55 2
|
4月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
在数据结构的广袤领域中,图是一种强大而复杂的结构,而深度优先搜索(DFS)和广度优先搜索(BFS)则是遍历图的两把利剑。Python 以其简洁和强大的特性,为我们提供了实现和运用这两种算法的便捷途径。
106 0
|
6月前
|
前端开发 JavaScript 数据库
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
|
6月前
|
JavaScript Java Python
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
|
7月前
|
中间件 数据库 开发者
解析Python Web框架的四大支柱:模板、ORM、中间件与路由
【7月更文挑战第20天】Python Web框架如Django、Flask、FastAPI的核心包括模板(如Django的DTL和Flask的Jinja2)、ORM(Django的内置ORM与Flask的SQLAlchemy)、中间件(Django的全局中间件与Flask的装饰器实现)和路由(Django的urls.py配置与Flask的@app.route()装饰器)。这些组件提升了代码组织和数据库操作的便捷性,确保了Web应用的稳定性和可扩展性。
83 0
|
7月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
【7月更文挑战第12天】图的遍历利器:DFS 和 BFS。Python 中,图可表示为邻接表或矩阵。DFS 沿路径深入,回溯时遍历所有可达顶点,适合找路径和环。BFS 层次遍历,先近后远,解决最短路径问题。两者在迷宫、网络路由等场景各显神通。通过练习,掌握这些算法,图处理将游刃有余。
78 3
|
7月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
【7月更文挑战第12天】在Python中,图数据结构通过邻接表实现,如`Graph`类所示。深度优先搜索(DFS)和广度优先搜索(BFS)是图遍历的关键算法。DFS递归遍历从起点开始的分支,常用于路径查找和连通性检查;BFS使用队列,适用于找最短路径。
70 3

热门文章

最新文章

推荐镜像

更多