26
26
27
27
<!-- 这里可写通用的实现逻辑 -->
28
28
29
- DFS 思路
29
+ ** 方法一: DFS**
30
30
31
- ** 剪枝:**
32
- 防止多次进入同一个位置,走过的位置要将其置为 1
31
+ 我们可以使用深度优先搜索来解决本题。我们从左上角开始,向右或向下移动,直到到达右下角。如果在某一步,我们发现当前位置是障碍物,或者当前位置已经在路径中,那么我们就返回,否则我们将当前位置加入路径中,并且标记当前位置为已经访问过,然后继续向右或向下移动。
32
+
33
+ 如果最终能够到达右下角,那么我们就找到了一条可行的路径,否则说明不存在可行的路径。
34
+
35
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是网格的行数和列数。
33
36
34
37
<!-- tabs:start -->
35
38
@@ -38,15 +41,106 @@ DFS 思路
38
41
<!-- 这里可写当前语言的特殊实现逻辑 -->
39
42
40
43
``` python
41
-
44
+ class Solution :
45
+ def pathWithObstacles (self , obstacleGrid : List[List[int ]]) -> List[List[int ]]:
46
+ def dfs (i , j ):
47
+ if i >= m or j >= n or obstacleGrid[i][j] == 1 :
48
+ return False
49
+ ans.append([i, j])
50
+ obstacleGrid[i][j] = 1
51
+ if (i == m - 1 and j == n - 1 ) or dfs(i + 1 , j) or dfs(i, j + 1 ):
52
+ return True
53
+ ans.pop()
54
+ return False
55
+
56
+ m, n = len (obstacleGrid), len (obstacleGrid[0 ])
57
+ ans = []
58
+ return ans if dfs(0 , 0 ) else []
42
59
```
43
60
44
61
### ** Java**
45
62
46
63
<!-- 这里可写当前语言的特殊实现逻辑 -->
47
64
48
65
``` java
66
+ class Solution {
67
+ private List<List<Integer > > ans = new ArrayList<> ();
68
+ private int [][] g;
69
+ private int m;
70
+ private int n;
71
+
72
+ public List<List<Integer > > pathWithObstacles (int [][] obstacleGrid ) {
73
+ g = obstacleGrid;
74
+ m = g. length;
75
+ n = g[0 ]. length;
76
+ return dfs(0 , 0 ) ? ans : Collections . emptyList();
77
+ }
78
+
79
+ private boolean dfs (int i , int j ) {
80
+ if (i >= m || j >= n || g[i][j] == 1 ) {
81
+ return false ;
82
+ }
83
+ ans. add(List . of(i, j));
84
+ g[i][j] = 1 ;
85
+ if ((i == m - 1 && j == n - 1 ) || dfs(i + 1 , j) || dfs(i, j + 1 )) {
86
+ return true ;
87
+ }
88
+ ans. remove(ans. size() - 1 );
89
+ return false ;
90
+ }
91
+ }
92
+ ```
49
93
94
+ ### ** C++**
95
+
96
+ ``` cpp
97
+ class Solution {
98
+ public:
99
+ vector<vector<int >> pathWithObstacles(vector<vector<int >>& obstacleGrid) {
100
+ int m = obstacleGrid.size();
101
+ int n = obstacleGrid[ 0] .size();
102
+ vector<vector<int >> ans;
103
+ function<bool(int, int)> dfs = [ &] (int i, int j) -> bool {
104
+ if (i >= m || j >= n || obstacleGrid[ i] [ j ] == 1) {
105
+ return false;
106
+ }
107
+ ans.push_back({i, j});
108
+ obstacleGrid[ i] [ j ] = 1;
109
+ if ((i == m - 1 && j == n - 1) || dfs(i + 1, j) || dfs(i, j + 1)) {
110
+ return true;
111
+ }
112
+ ans.pop_back();
113
+ return false;
114
+ };
115
+ return dfs(0, 0) ? ans : vector<vector<int >>();
116
+ }
117
+ };
118
+ ```
119
+
120
+ ### **Go**
121
+
122
+ ```go
123
+ func pathWithObstacles(obstacleGrid [][]int) [][]int {
124
+ m, n := len(obstacleGrid), len(obstacleGrid[0])
125
+ ans := [][]int{}
126
+ var dfs func(i, j int) bool
127
+ dfs = func(i, j int) bool {
128
+ if i >= m || j >= n || obstacleGrid[i][j] == 1 {
129
+ return false
130
+ }
131
+ ans = append(ans, []int{i, j})
132
+ obstacleGrid[i][j] = 1
133
+ if (i == m-1 && j == n-1) || dfs(i+1, j) || dfs(i, j+1) {
134
+ return true
135
+ }
136
+ ans = ans[:len(ans)-1]
137
+ return false
138
+ }
139
+ if dfs(0, 0) {
140
+ return ans
141
+ }
142
+ return [][]int{}
143
+ }
50
144
```
51
145
52
146
### ** TypeScript**
0 commit comments