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算法相关的题了。

目录
相关文章
|
3月前
|
大数据 Python
Python 采集87个手绘风格PPT模板
Python 采集87个手绘风格PPT模板
56 1
|
3月前
|
SQL 前端开发 JavaScript
Python 教程之 Django(10)模板
Python 教程之 Django(10)模板
49 0
|
3月前
|
Python
Python 采集77个教学课件PPT模板
Python 采集77个教学课件PPT模板
49 0
|
3月前
|
数据采集 Python
【Python自动化】多线程BFS站点结构爬虫代码,支持中断恢复,带注释
【Python自动化】多线程BFS站点结构爬虫代码,支持中断恢复,带注释
50 0
|
3月前
|
计算机视觉 Python
OpenCV多模板匹配讲解与匹配汽车实战(附Python源码)
OpenCV多模板匹配讲解与匹配汽车实战(附Python源码)
122 0
OpenCV多模板匹配讲解与匹配汽车实战(附Python源码)
|
1月前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
【7月更文挑战第11天】图论核心在于DFS与BFS。DFS深入探索,适用于找解空间;BFS逐层扩展,擅寻最短路径。
35 8
|
1月前
|
存储 算法 Python
Python图论实战:从零基础到精通DFS与BFS遍历,轻松玩转复杂网络结构
【7月更文挑战第11天】图论在数据科学中扮演关键角色,用于解决复杂网络问题。Python因其易用性和库支持成为实现图算法的首选。本文通过问答形式介绍DFS和BFS,图是节点和边的数据结构,遍历用于搜索和分析。Python中图可表示为邻接表,DFS用递归遍历,BFS借助队列。DFS适用于深度探索,BFS则用于最短路径。提供的代码示例帮助理解如何在Python中应用这两种遍历算法。开始探索图论,解锁更多技术可能!
63 6
|
1月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
【7月更文挑战第12天】图的遍历利器:DFS 和 BFS。Python 中,图可表示为邻接表或矩阵。DFS 沿路径深入,回溯时遍历所有可达顶点,适合找路径和环。BFS 层次遍历,先近后远,解决最短路径问题。两者在迷宫、网络路由等场景各显神通。通过练习,掌握这些算法,图处理将游刃有余。
40 3
|
1月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
【7月更文挑战第12天】在Python中,图数据结构通过邻接表实现,如`Graph`类所示。深度优先搜索(DFS)和广度优先搜索(BFS)是图遍历的关键算法。DFS递归遍历从起点开始的分支,常用于路径查找和连通性检查;BFS使用队列,适用于找最短路径。
29 3
|
1月前
|
算法 Python
深度挖掘Python图结构:DFS与BFS遍历的艺术,让复杂问题迎刃而解
【7月更文挑战第11天】在数据结构与算法中,图的遍历如DFS和BFS是解决复杂问题的关键。DFS深入探索直至无路可走,回溯找其他路径,适合找任意解;BFS则逐层扩展,常用于找最短路径。在迷宫问题中,BFS确保找到最短路径,DFS则可能不是最短。Python实现展示了两种方法如何在图(迷宫)中寻找从起点到终点的路径。
22 1