[Leetcode] 63 고유 경로 II은 (경로 및 장애물을 추구)

로봇은 왼쪽 상단의 위치  m에서  의 X  n 개  (아래 그림의 '시작'로 표시된) 그리드.

로봇은 어느 시점에서 하나 아래로 또는 오른쪽으로 이동할 수 있습니다. 로봇은 (아래 그림에서 '완료'로 표시) 그리드의 오른쪽 하단에 도달하기 위해 노력하고있다.

지금 생각 몇 가지 장애물이 그리드에 추가하는 경우 . 얼마나 많은 고유의 경로가있을 것인가?

장애물과 빈 공간으로 표시됩니다  1 및  0 각각 그리드.

참고 :  m  과  n은  가장 (100)에있을 것입니다.

예 1 :

입력 : 
[ 
  [ 0,0,0 ], 
  [ 0,1,0 ], 
  [ 0,0,0 ] 
] 
출력 : 2 
설명 : 
위의 3 × 3 격자의 중간에 하나 개의 장애물이 있습니다. 
바닥에 도달하는 방법은 두 가지가 있습니다 - 오른쪽은 :
 1. 마우스 오른쪽 -> 오른쪽 -> 아래 -> 아래
 2 다운 -> 아래 -> 오른쪽 -> 오른쪽

 

문제의 의미

 

아이디어 : 메모리 검색 (DFS + 메모)

 

코드

1 개  공용  클래스 _63_UniquePathsII {
 2      개인  INT [] [] 메모;  // 缓存
3      공개  INT uniquePathsWithObstacles ( INT [] [] obstacleGrid) {
 4          최종  INT m = obstacleGrid.length;
(5)          최종  INT N = obstacleGrid [0 ] .length;
(6)          의 경우 (obstacleGrid [0] [0] = 0 ||!
 7                  obstacleGrid [m - 1] [N - 1]! = 0) 복귀 0 ;
8  
9          메모 = 새로운  INT [m] [n]을;
10          메모 [0] [0] = obstacleGrid [0] [0] = 0 0 :. 1!? ;
 11.           DFS (obstacleGrid, m - 1 N-- 1.. )
 (12)이다      }
 13은  
14      // (0 @return 의 (x, y)의 총 수는 0) 경로 
(15)      INT DFS ( INT [] [] obstacleGrid, INT의 X, INT Y) {
 16          IF (X <0 || Y <0) 복귀 0; // 잘못된 데이터 종료 조건
 . 17  
(18)이다          // (X, Y)는 장애이다 
(19).          IF (obstacleGrid [X] [Y]! = 0) 복귀 0 ]
 (20)가  
21 인          경우(X == 0 && Y == 0) 리턴 메모 [0] [0]; // 回到起点,收敛条件
22  
23          경우 (메모 [X] [Y]> 0 ) {
 24              반환 메모 [X] [Y];
25          } 다른 {
 26              반환 메모 [X] [Y]를 DFS = (obstacleGrid, X - 1, Y) +
 27                      DFS (obstacleGrid, X, Y - 1 );
28          }
 29      }
 30 }

 

추천

출처www.cnblogs.com/liuliu5151/p/10953066.html