Python程序:查找最小努力路径
假设我们有一个m x n阶的二维矩阵height。heights[i][j]表示单元格(i, j)的高度。如果我们在(0, 0)单元格,我们想要移动到右下单元格(m-1, n-1)。我们可以向上、下、左或右移动,我们希望找到一条需要最小努力的路线。在这个问题中,路线的努力是路线中两个连续单元格之间高度的最大绝对差。因此,最终我们需要找到到达目的地的最小努力。
因此,如果输入如下:
2 | 3 | 4 |
4 | 9 | 5 |
6 | 4 | 6 |
则输出为1,因为路线[2,3,4,5,6]中连续单元格的最大绝对差为1。
为了解决这个问题,我们将遵循以下步骤:
- r := heights的行数,c:= heights的列数
- queue:= 一个队列,最初存储一个元组(0,0,0)
- 当队列不为空时,执行以下操作:
- cur:= 队列的第一个项目,并将其从队列中删除
- c_eff:= cur[0]
- x:= cur[1]
- y:= cur[2]
- 如果x等于r-1且y等于c-1,则
- 返回c_eff
- 如果heights[x, y]为空字符串,则
- 进入下一个迭代
- 对于每个dx,dy in [[1,0],[-1,0],[0,1],[0,-1]],执行以下操作:
- newx := x+dx
- newy := y+dy
- 如果0 <= newx < r 且 0 <= newy < c 且 heights[newx, newy]不等于空字符串,则
- eff := c_eff和|heights[newx,newy] - heights[x,y]|中的最大值
- 将元组(eff, newx, newy)插入队列
- heights[x, y]:= 空字符串
示例
让我们看看下面的实现来更好地理解:
import heapq def solve(heights): r,c=len(heights),len(heights[0]) queue=[(0,0,0)] while queue: cur=heapq.heappop(queue) c_eff=cur[0] x=cur[1] y=cur[2] if x==r-1 and y==c-1: return c_eff if heights[x][y]=="": continue for dx,dy in [[1,0],[-1,0],[0,1],[0,-1]]: newx=x+dx newy=y+dy if 0<=newx<r and 0<=newy<c and heights[newx][newy]!="": eff = max(c_eff, abs(heights[newx][newy] - heights[x][y])) heapq.heappush(queue,(eff, newx, newy)) heights[x][y]="" matrix = [[2,3,4],[4,9,5],[6,4,6]] print(solve(matrix))
输入
[[2,3,4],[4,9,5],[6,4,6]]
输出
1
广告