Python|利用BFS求表格中的最短路径

简介: Python|利用BFS求表格中的最短路径

问题描述

如何用BFS算法解决力扣平台上一道困难题目。给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。每一步您都可以在空白单元格中上、下、左、右移动。

如果您 最多 可以消除 k 个障碍物,请找出从左上角 (0,0) 到右下角 (m-1, n-1) 的最短路径,并返回通过该路径所需的步数。如果找不到这样的路径,则返回 -1。

示例 1:

输入:

grid =

[[0,0,0],

[1,1,0],

[0,0,0],

[0,1,1],

[0,0,0]],

k = 1

输出:6

解释:

不消除任何障碍的最短路径是 10。

消除位置 (3,2) 处的障碍后,最短路径是 6 。该路径是 (0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (3,2)-> (4,2).

示例 2:

输入:

grid =

[[0,1,1],

[1,1,1],

[1,0,0]],

k = 1

输出:-1

解释:

我们至少需要消除两个障碍才能找到这样的路径。

解决方案

本题我们可以设置起点q为(0,0,k),再规定一个列表d= [[0, 1], [0, -1], [1, 0], [-1, 0]]来控制移动,每经过一次障碍物k就减1,最后在m*n的矩阵里面,终点为(m-1,n-1,0),我们利用BFS广搜找出到达终点的所有结果即可,每次结果经过的点不能重复,我们规定一个集合memory来储存已经经过的点,以确保广搜的时候不会来回重复经过某一个点。

代码示例:

def shortestPath(g,k):

     r, c = len(g), len(g[0])

     d = [[0, 1], [0, -1], [1, 0], [-1, 0]]

     mem = set([(0, 0, k)])

     q = [(0, 0, k)]

     step = 0

     while q:

         n = len(q)

         for _ in range(n):

             x, y, pre = q.pop(0)#将当以前的点赋给(x,y,pre)来进行下一步。

             if x == r - 1 and y == c - 1:

                 return step

             for i, j in d:#利用BFS找出每次移动后的所有点g[nx][ny]

                 nx, ny = x + i, y + j

                 if nx >= 0 and nx  < r and ny >= 0 and ny < c:

#规定条件确保所搜点再矩阵内部

                     if g[nx][ny] == 1:#当遇到障碍物时

                         if pre and (nx,  ny, pre - 1) not in mem:

                              q.append((nx, ny, pre - 1))

                             mem.add((nx, ny, pre - 1))

                     else:

                         if (nx, ny,  pre) not in mem:

                              q.append((nx, ny, pre))

                              mem.add((nx, ny, pre))

         step += 1

     return -1

结语

本题主要考察BFS算法的运用,以及如何用代码在矩阵里进行一些移动,修改变量的操作,这是笔者第一次解决力扣平台上难度为困难的题目,用了将近一下午的时间,为了能更多解决这些类似的题,还要多加练习,希望和笔者一起进步。

目录
相关文章
|
2月前
|
数据处理 索引 Python
用Python实现数据录入、追加、数据校验并生成表格
本示例展示了如何使用Python和Pandas库实现学生期末考试成绩的数据录入、追加和校验,并生成Excel表格。首先通过`pip install pandas openpyxl`安装所需库,然后定义列名、检查并读取现有数据、用户输入数据、数据校验及保存至Excel文件。程序支持成绩范围验证,确保数据准确性。
100 14
|
3月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
43 2
|
3月前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
55 2
|
7月前
|
数据挖掘 Python
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
663 0
|
9月前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
246 0
|
4月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
在数据结构的广袤领域中,图是一种强大而复杂的结构,而深度优先搜索(DFS)和广度优先搜索(BFS)则是遍历图的两把利剑。Python 以其简洁和强大的特性,为我们提供了实现和运用这两种算法的便捷途径。
106 0
|
7月前
|
关系型数据库 MySQL 数据库
使用Python读取xlsx表格数据并导入到MySQL数据库中时遇到的问题24
【7月更文挑战第24天】使用Python读取xlsx表格数据并导入到MySQL数据库中
79 7
|
8月前
|
数据采集 Web App开发 数据挖掘
使用Python和BeautifulSoup轻松抓取表格数据
使用Python和BeautifulSoup,结合代理IP,可以从网页抓取表格数据,如中国气象局的天气信息。通过requests库发送HTTP请求,BeautifulSoup解析HTML提取表格。安装必要库后,设置代理IP,发送请求,解析HTML找到表格,提取数据并存储。通过Pandas进行数据分析,如计算平均气温。这种方法让数据抓取和分析变得更加便捷。
248 3
使用Python和BeautifulSoup轻松抓取表格数据
|
7月前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
【7月更文挑战第11天】图论核心在于DFS与BFS。DFS深入探索,适用于找解空间;BFS逐层扩展,擅寻最短路径。
74 8
|
7月前
|
存储 算法 Python
Python图论实战:从零基础到精通DFS与BFS遍历,轻松玩转复杂网络结构
【7月更文挑战第11天】图论在数据科学中扮演关键角色,用于解决复杂网络问题。Python因其易用性和库支持成为实现图算法的首选。本文通过问答形式介绍DFS和BFS,图是节点和边的数据结构,遍历用于搜索和分析。Python中图可表示为邻接表,DFS用递归遍历,BFS借助队列。DFS适用于深度探索,BFS则用于最短路径。提供的代码示例帮助理解如何在Python中应用这两种遍历算法。开始探索图论,解锁更多技术可能!
183 6

热门文章

最新文章