63. 상이한 경로 II
왼쪽 코너 MXN 그리드에 위치한 로봇 (아래 "시작"이라는 점 그림을 시작).
로봇은 오른쪽이나 아래로 한 단계를 이동할 수 있습니다. 로봇 ( "마침"이라는 다음 그림) 그리드의 오른쪽 하단 모서리에 도달하려고합니다.
이제 그리드 장애물을 고려하십시오. 가있을 것입니다 그래서 얼마나 많은 서로 다른 경로 위에서는 오른쪽 아래 왼쪽?
빈 그리드 위치를 각각 1과 0이 표현하는 장애물.
설명 : n은 m의 값은하게는 100 이상이다.
예 1 :
입력 :
[
[0,0,0],
[0,1,0],
[0,0,0]
]
출력 : 2
설명 :
중간는 3 × 3 격자 장애를 가지고있다.
에서 상위 두 개의 서로 다른 경로의 총의 오른쪽 아래 왼쪽 :
- 마우스 오른쪽 -> 오른쪽 -> 아래 -> 아래로
- 아래로 -> 아래 -> 우측 -> 우측
출처 : 숙박 버튼 (LeetCode)
링크 : HTTPS : //leetcode-cn.com/problems/unique-paths-ii는
모든 네트워크에서 공제 저작권. 상업 무단 전재 소스를 표시하시기 바랍니다 승인 된 공식, 비상업적 재판에 문의하시기 바랍니다.
class Solution {
public int uniquePathsWithObstacles(int[][] arr) {
if (arr == null || arr.length <= 0) {
return 0;
}
int rows = arr.length;
int cols = arr[0].length;
int[][] dp = new int[rows][cols];
for (int i = 0; i < cols; i++)
if (arr[0][i] == 1) {
dp[0][i] = 0;
break; // 遇到障碍后面的都无法到达直接返回就行 默认就是0
}
else dp[0][i] = 1;
for (int i = 0; i < rows; i++)
if (arr[i][0] == 1) {
dp[i][0] = 0;
break; // 遇到障碍后面的都无法到达直接返回就行 默认就是0
}
else dp[i][0] = 1;
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
if (arr[i][j] == 1) dp[i][j] = 0; // 遇到障碍就是0
else dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; // dpdpdp
}
}
return dp[rows - 1][cols - 1];
}
}