로봇은 왼쪽 상단의 위치 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 }