leetcode 1368. Minimum Cost to Make at Least One Valid Path in a Grid
Given a m x n grid
. Each cell of the grid
has a sign pointing to the next cell you should visit if you are currently in this cell. The sign of grid[i][j]
can be:
-
1 which means go to the cell to the right. (i.e go from
grid[i][j]
togrid[i][j + 1]
) -
2 which means go to the cell to the left. (i.e go from
grid[i][j]
togrid[i][j - 1]
) -
3 which means go to the lower cell. (i.e go from
grid[i][j]
togrid[i + 1][j]
) -
4 which means go to the upper cell. (i.e go from
grid[i][j]
togrid[i - 1][j]
)
Notice that there could be some invalid signs on the cells of the grid
which points outside the grid
.
You will initially start at the upper left cell (0,0)
. A valid path in the grid is a path which starts from the upper left cell (0,0)
and ends at the bottom-right cell (m - 1, n - 1)
following the signs on the grid. The valid path doesn't have to be the shortest.
You can modify the sign on a cell with cost = 1
. You can modify the sign on a cell one time only.
Return the minimum cost to make the grid have at least one valid path.
Example 1:
Input: grid = [[1,1,1,1],[2,2,2,2],[1,1,1,1],[2,2,2,2]]
Output: 3
Explanation: You will start at point (0, 0).
The path to (3, 3) is as follows. (0, 0) --> (0, 1) --> (0, 2) --> (0, 3) change the arrow to down with cost = 1 --> (1, 3) --> (1, 2) --> (1, 1) --> (1, 0) change the arrow to down with cost = 1 --> (2, 0) --> (2, 1) --> (2, 2) --> (2, 3) change the arrow to down with cost = 1 --> (3, 3)
The total cost = 3.
Example 2:
Input: grid = [[1,1,3],[3,2,2],[1,1,4]]
Output: 0
Explanation: You can follow the path from (0, 0) to (2, 2).
Example 3:
Input: grid = [[1,2],[4,3]]
Output: 1
Example 4:
Input: grid = [[2,2,2],[2,2,2]]
Output: 3
Example 5:
Input: grid = [[4]]
Output: 0
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 100
题目根据单元格内的指示牌行走。求最少更改几次指示牌可以从grid[0][0]走到grid[-1][-1](右下角)
简单题。DP,一轮一轮的计算更改step次能走到的所有点。代码如下:
class Solution(object):
def minCost(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
row = len(grid)
col = len(grid[0])
status = [[False for _ in range(col)] for _ in range(row)]
l = [[0,0]]
step = 0
while True:
t = []
for x,y in l: # 遍历所有可以走到的位置
while not status[x][y]:
status[x][y] = True
d = grid[x][y]
t.append([x,y])
if d == 1 and y < col-1:
y += 1
elif d == 2 and y > 0:
y -= 1
elif d == 3 and x < row-1:
x += 1
elif d == 4 and x > 0:
x -= 1
if status[-1][-1]:#没有走到
return step
step += 1 #增加一次更改的机会,将这一轮新增的点上下左右的点加入到下一轮起点列表中
l = []
for x,y in t:
if x > 0:
l.append([x-1,y])
if x < row-1:
l.append([x+1,y])
if y > 0:
l.append([x,y-1])
if y < col-1:
l.append([x,y+1])