题目描述:具体描述见原题。该题在题目No.62上稍稍变化了一下,在路径上引入了障碍,即障碍点不可达。
解题思路:由于前进方向还是只有水平向前和垂直向下,所以基本思路及过程同62,唯一不同的地方是在求迷宫边界路径数时需结合障碍点,只有该点前一点可达且该点不为障碍点时,认为该点可达,赋值为1。构造完边界条件后,如果该点不为障碍点,认为该点可达,求和赋值。具体过程见代码。
具体代码:
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
if len(obstacleGrid) == 0 || obstacleGrid[0][0] == 1 { // 如果迷宫长度为0或者入口点为障碍点,则直接返回0
return 0
}
m, n := len(obstacleGrid), len(obstacleGrid[0]) // 如果迷宫入口点不为障碍点,则构造二维数组,数组中每项元素值为初始位置到该位置走法数量
res := make([][]int, m)
for i := 0; i < m; i++ {
res[i] = make([]int, n)
}
res[0][0] = 1 // 入口不为障碍点,二维数组[0][0]位置上直接赋1,方便后续判断
for i := 1; i < m; i++ {
if res[i-1][0] != 0 && obstacleGrid[i][0] == 0 { // 求解边界走法数量值。如果该点可达,且该点不为障碍点,则直接赋1。由于前进方向限制,边界上任何一个非障碍点,永远只有一条路径可达。
res[i][0] = 1
}
}
for i := 1; i < n; i++ {
if res[0][i-1] != 0 && obstacleGrid[0][i] == 0 {
res[0][i] = 1
}
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if obstacleGrid[i][j] == 0 { // 如果该点不为障碍点,套用dp核心公式
res[i][j] = res[i-1][j] + res[i][j-1]
}
}
}
return res[m-1][n-1]
}
补充说明:该题目也是dp基本应用之一。由于障碍点的存在,该题比62多了一些判断条件。研究背景太难编了,求上天赐我2000字,濒临deadline。