本文旨在探讨LeetCode题目中的网格路径问题,这些问题通常涉及到动态规划或者是广度优先搜索。
网格中的最短路径LeetCode 1293
给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。每一步,您都可以在空白单元格中上、下、左、右移动。
如果您 最多 可以消除 k 个障碍物,请找出从左上角 (0, 0) 到右下角 (m-1, n-1) 的最短路径,并返回通过该路径所需的步数。如果找不到这样的路径,则返回 -1 。
1 | class Solution: |
利用广度优先算法,分别利用visited记录走过的路径,利用q记录当前所在位置以及状态。另外,需要确定程序结束的边界条件。
不同路径Ileetcode 62
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
1 | class Solution: |
不同路径IIleetcode 63
1 | def uniquePathsWithObstacles(obstacleGrid): |
主要思路是动态规划算法,假设$dp[i][j]$代表到达(i,j)位置路径数量,如果(i,j)位置有障碍,则到达不了$dp[i][j]=0$。如果(i,j)位置没有障碍,那么$dp[i][j]=dp[i-1][j]+dp[i][j-]$
不同路径IIIleetcode 980
在二维网格 grid 上,有 4 种类型的方格:
1 表示起始方格。且只有一个起始方格。
2 表示结束方格,且只有一个结束方格。
0 表示我们可以走过的空方格。
-1 表示我们无法跨越的障碍。
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。
每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。
1 | class Solution: |
网格路径最大和leetcode 47
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
1 | class Solution: |
使用动态规划方法,转移方程为$dp[i][j]=max(dp[i-1][j], dp[i][j-1])$
单词搜索leetcode 79
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
1 | class Solution: |