Skip to content

Commit 593cb90

Browse files
committedSep 8, 2022
feat: add solutions to lc problem: No.0576
No.0576.Out of Boundary Paths
1 parent ac869f2 commit 593cb90

File tree

6 files changed

+444
-25
lines changed

6 files changed

+444
-25
lines changed
 

‎solution/0500-0599/0576.Out of Boundary Paths/README.md

+167-1
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,188 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:记忆化搜索**
45+
46+
定义 `dfs(i, j, k)` 表示当前位于坐标 $(i, j)$,且剩余移动次数为 $k$ 时,可以出界的路径数。记忆化搜索即可。
47+
48+
时间复杂度 $O(m\times n\times k)$,空间复杂度 $O(m\times n\times k)$。其中 $m$, $n$, $k$ 分别表示网格的行数、列数、最大可移动次数。
49+
4450
<!-- tabs:start -->
4551

4652
### **Python3**
4753

4854
<!-- 这里可写当前语言的特殊实现逻辑 -->
4955

5056
```python
51-
57+
class Solution:
58+
def findPaths(self, m: int, n: int, maxMove: int, startRow: int, startColumn: int) -> int:
59+
@cache
60+
def dfs(i, j, k):
61+
if i < 0 or j < 0 or i >= m or j >= n:
62+
return 1
63+
if k <= 0:
64+
return 0
65+
res = 0
66+
for a, b in [[-1, 0], [1, 0], [0, 1], [0, -1]]:
67+
x, y = i + a, j + b
68+
res += dfs(x, y, k - 1)
69+
res %= mod
70+
return res
71+
72+
mod = 10**9 + 7
73+
return dfs(startRow, startColumn, maxMove)
5274
```
5375

5476
### **Java**
5577

5678
<!-- 这里可写当前语言的特殊实现逻辑 -->
5779

5880
```java
81+
class Solution {
82+
private int m;
83+
private int n;
84+
private int[][][] f;
85+
private static final int[] DIRS = {-1, 0, 1, 0, -1};
86+
private static final int MOD = (int) 1e9 + 7;
87+
88+
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
89+
this.m = m;
90+
this.n = n;
91+
f = new int[m + 1][n + 1][maxMove + 1];
92+
for (var a : f) {
93+
for (var b : a) {
94+
Arrays.fill(b, -1);
95+
}
96+
}
97+
return dfs(startRow, startColumn, maxMove);
98+
}
99+
100+
private int dfs(int i, int j, int k) {
101+
if (i < 0 || i >= m || j < 0 || j >= n) {
102+
return 1;
103+
}
104+
if (f[i][j][k] != -1) {
105+
return f[i][j][k];
106+
}
107+
if (k == 0) {
108+
return 0;
109+
}
110+
int res = 0;
111+
for (int t = 0; t < 4; ++t) {
112+
int x = i + DIRS[t];
113+
int y = j + DIRS[t + 1];
114+
res += dfs(x, y, k - 1);
115+
res %= MOD;
116+
}
117+
f[i][j][k] = res;
118+
return res;
119+
}
120+
}
121+
```
122+
123+
```java
124+
class Solution {
125+
public int findPaths(int m, int n, int N, int i, int j) {
126+
final int MOD = (int) (1e9 + 7);
127+
final int[] dirs = new int[] {-1, 0, 1, 0, -1};
128+
int[][] f = new int[m][n];
129+
f[i][j] = 1;
130+
int res = 0;
131+
for (int step = 0; step < N; ++step) {
132+
int[][] temp = new int[m][n];
133+
for (int x = 0; x < m; ++x) {
134+
for (int y = 0; y < n; ++y) {
135+
for (int k = 0; k < 4; ++k) {
136+
int tx = x + dirs[k], ty = y + dirs[k + 1];
137+
if (tx >= 0 && tx < m && ty >= 0 && ty < n) {
138+
temp[tx][ty] += f[x][y];
139+
temp[tx][ty] %= MOD;
140+
} else {
141+
res += f[x][y];
142+
res %= MOD;
143+
}
144+
}
145+
}
146+
}
147+
f = temp;
148+
}
149+
return res;
150+
}
151+
}
152+
```
153+
154+
### **C++**
155+
156+
```cpp
157+
class Solution {
158+
public:
159+
int m;
160+
int n;
161+
const int mod = 1e9 + 7;
162+
int f[51][51][51];
163+
int dirs[5] = {-1, 0, 1, 0, -1};
164+
165+
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
166+
memset(f, 0xff, sizeof(f));
167+
this->m = m;
168+
this->n = n;
169+
return dfs(startRow, startColumn, maxMove);
170+
}
171+
172+
int dfs(int i, int j, int k) {
173+
if (i < 0 || i >= m || j < 0 || j >= n) return 1;
174+
if (f[i][j][k] != -1) return f[i][j][k];
175+
if (k == 0) return 0;
176+
int res = 0;
177+
for (int t = 0; t < 4; ++t) {
178+
int x = i + dirs[t], y = j + dirs[t + 1];
179+
res += dfs(x, y, k - 1);
180+
res %= mod;
181+
}
182+
f[i][j][k] = res;
183+
return res;
184+
}
185+
};
186+
```
59187
188+
### **Go**
189+
190+
```go
191+
func findPaths(m int, n int, maxMove int, startRow int, startColumn int) int {
192+
f := make([][][]int, m+1)
193+
for i := range f {
194+
f[i] = make([][]int, n+1)
195+
for j := range f[i] {
196+
f[i][j] = make([]int, maxMove+1)
197+
for k := range f[i][j] {
198+
f[i][j][k] = -1
199+
}
200+
}
201+
}
202+
var mod int = 1e9 + 7
203+
dirs := []int{-1, 0, 1, 0, -1}
204+
var dfs func(i, j, k int) int
205+
dfs = func(i, j, k int) int {
206+
if i < 0 || i >= m || j < 0 || j >= n {
207+
return 1
208+
}
209+
if f[i][j][k] != -1 {
210+
return f[i][j][k]
211+
}
212+
if k == 0 {
213+
return 0
214+
}
215+
res := 0
216+
for t := 0; t < 4; t++ {
217+
x, y := i+dirs[t], j+dirs[t+1]
218+
res += dfs(x, y, k-1)
219+
res %= mod
220+
}
221+
f[i][j][k] = res
222+
return res
223+
}
224+
return dfs(startRow, startColumn, maxMove)
225+
}
60226
```
61227

62228
### **...**

‎solution/0500-0599/0576.Out of Boundary Paths/README_EN.md

+161-1
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,173 @@
4040
### **Python3**
4141

4242
```python
43-
43+
class Solution:
44+
def findPaths(self, m: int, n: int, maxMove: int, startRow: int, startColumn: int) -> int:
45+
@cache
46+
def dfs(i, j, k):
47+
if i < 0 or j < 0 or i >= m or j >= n:
48+
return 1
49+
if k <= 0:
50+
return 0
51+
res = 0
52+
for a, b in [[-1, 0], [1, 0], [0, 1], [0, -1]]:
53+
x, y = i + a, j + b
54+
res += dfs(x, y, k - 1)
55+
res %= mod
56+
return res
57+
58+
mod = 10**9 + 7
59+
return dfs(startRow, startColumn, maxMove)
4460
```
4561

4662
### **Java**
4763

4864
```java
65+
class Solution {
66+
private int m;
67+
private int n;
68+
private int[][][] f;
69+
private static final int[] DIRS = {-1, 0, 1, 0, -1};
70+
private static final int MOD = (int) 1e9 + 7;
71+
72+
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
73+
this.m = m;
74+
this.n = n;
75+
f = new int[m + 1][n + 1][maxMove + 1];
76+
for (var a : f) {
77+
for (var b : a) {
78+
Arrays.fill(b, -1);
79+
}
80+
}
81+
return dfs(startRow, startColumn, maxMove);
82+
}
83+
84+
private int dfs(int i, int j, int k) {
85+
if (i < 0 || i >= m || j < 0 || j >= n) {
86+
return 1;
87+
}
88+
if (f[i][j][k] != -1) {
89+
return f[i][j][k];
90+
}
91+
if (k == 0) {
92+
return 0;
93+
}
94+
int res = 0;
95+
for (int t = 0; t < 4; ++t) {
96+
int x = i + DIRS[t];
97+
int y = j + DIRS[t + 1];
98+
res += dfs(x, y, k - 1);
99+
res %= MOD;
100+
}
101+
f[i][j][k] = res;
102+
return res;
103+
}
104+
}
105+
```
106+
107+
```java
108+
class Solution {
109+
public int findPaths(int m, int n, int N, int i, int j) {
110+
final int MOD = (int) (1e9 + 7);
111+
final int[] dirs = new int[] {-1, 0, 1, 0, -1};
112+
int[][] f = new int[m][n];
113+
f[i][j] = 1;
114+
int res = 0;
115+
for (int step = 0; step < N; ++step) {
116+
int[][] temp = new int[m][n];
117+
for (int x = 0; x < m; ++x) {
118+
for (int y = 0; y < n; ++y) {
119+
for (int k = 0; k < 4; ++k) {
120+
int tx = x + dirs[k], ty = y + dirs[k + 1];
121+
if (tx >= 0 && tx < m && ty >= 0 && ty < n) {
122+
temp[tx][ty] += f[x][y];
123+
temp[tx][ty] %= MOD;
124+
} else {
125+
res += f[x][y];
126+
res %= MOD;
127+
}
128+
}
129+
}
130+
}
131+
f = temp;
132+
}
133+
return res;
134+
}
135+
}
136+
```
137+
138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
int m;
144+
int n;
145+
const int mod = 1e9 + 7;
146+
int f[51][51][51];
147+
int dirs[5] = {-1, 0, 1, 0, -1};
148+
149+
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
150+
memset(f, 0xff, sizeof(f));
151+
this->m = m;
152+
this->n = n;
153+
return dfs(startRow, startColumn, maxMove);
154+
}
155+
156+
int dfs(int i, int j, int k) {
157+
if (i < 0 || i >= m || j < 0 || j >= n) return 1;
158+
if (f[i][j][k] != -1) return f[i][j][k];
159+
if (k == 0) return 0;
160+
int res = 0;
161+
for (int t = 0; t < 4; ++t) {
162+
int x = i + dirs[t], y = j + dirs[t + 1];
163+
res += dfs(x, y, k - 1);
164+
res %= mod;
165+
}
166+
f[i][j][k] = res;
167+
return res;
168+
}
169+
};
170+
```
49171
172+
### **Go**
173+
174+
```go
175+
func findPaths(m int, n int, maxMove int, startRow int, startColumn int) int {
176+
f := make([][][]int, m+1)
177+
for i := range f {
178+
f[i] = make([][]int, n+1)
179+
for j := range f[i] {
180+
f[i][j] = make([]int, maxMove+1)
181+
for k := range f[i][j] {
182+
f[i][j][k] = -1
183+
}
184+
}
185+
}
186+
var mod int = 1e9 + 7
187+
dirs := []int{-1, 0, 1, 0, -1}
188+
var dfs func(i, j, k int) int
189+
dfs = func(i, j, k int) int {
190+
if i < 0 || i >= m || j < 0 || j >= n {
191+
return 1
192+
}
193+
if f[i][j][k] != -1 {
194+
return f[i][j][k]
195+
}
196+
if k == 0 {
197+
return 0
198+
}
199+
res := 0
200+
for t := 0; t < 4; t++ {
201+
x, y := i+dirs[t], j+dirs[t+1]
202+
res += dfs(x, y, k-1)
203+
res %= mod
204+
}
205+
f[i][j][k] = res
206+
return res
207+
}
208+
return dfs(startRow, startColumn, maxMove)
209+
}
50210
```
51211

52212
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution {
2+
public:
3+
int m;
4+
int n;
5+
const int mod = 1e9 + 7;
6+
int f[51][51][51];
7+
int dirs[5] = {-1, 0, 1, 0, -1};
8+
9+
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
10+
memset(f, 0xff, sizeof(f));
11+
this->m = m;
12+
this->n = n;
13+
return dfs(startRow, startColumn, maxMove);
14+
}
15+
16+
int dfs(int i, int j, int k) {
17+
if (i < 0 || i >= m || j < 0 || j >= n) return 1;
18+
if (f[i][j][k] != -1) return f[i][j][k];
19+
if (k == 0) return 0;
20+
int res = 0;
21+
for (int t = 0; t < 4; ++t) {
22+
int x = i + dirs[t], y = j + dirs[t + 1];
23+
res += dfs(x, y, k - 1);
24+
res %= mod;
25+
}
26+
f[i][j][k] = res;
27+
return res;
28+
}
29+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
func findPaths(m int, n int, maxMove int, startRow int, startColumn int) int {
2+
f := make([][][]int, m+1)
3+
for i := range f {
4+
f[i] = make([][]int, n+1)
5+
for j := range f[i] {
6+
f[i][j] = make([]int, maxMove+1)
7+
for k := range f[i][j] {
8+
f[i][j][k] = -1
9+
}
10+
}
11+
}
12+
var mod int = 1e9 + 7
13+
dirs := []int{-1, 0, 1, 0, -1}
14+
var dfs func(i, j, k int) int
15+
dfs = func(i, j, k int) int {
16+
if i < 0 || i >= m || j < 0 || j >= n {
17+
return 1
18+
}
19+
if f[i][j][k] != -1 {
20+
return f[i][j][k]
21+
}
22+
if k == 0 {
23+
return 0
24+
}
25+
res := 0
26+
for t := 0; t < 4; t++ {
27+
x, y := i+dirs[t], j+dirs[t+1]
28+
res += dfs(x, y, k-1)
29+
res %= mod
30+
}
31+
f[i][j][k] = res
32+
return res
33+
}
34+
return dfs(startRow, startColumn, maxMove)
35+
}
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,40 @@
11
class Solution {
2-
public int findPaths(int m, int n, int N, int i, int j) {
3-
final int MOD = (int) (1e9 + 7);
4-
final int[] dirs = new int[] {-1, 0, 1, 0, -1};
5-
int[][] f = new int[m][n];
6-
f[i][j] = 1;
7-
int res = 0;
8-
for (int step = 0; step < N; ++step) {
9-
int[][] temp = new int[m][n];
10-
for (int x = 0; x < m; ++x) {
11-
for (int y = 0; y < n; ++y) {
12-
for (int k = 0; k < 4; ++k) {
13-
int tx = x + dirs[k], ty = y + dirs[k + 1];
14-
if (tx >= 0 && tx < m && ty >= 0 && ty < n) {
15-
temp[tx][ty] += f[x][y];
16-
temp[tx][ty] %= MOD;
17-
} else {
18-
res += f[x][y];
19-
res %= MOD;
20-
}
21-
}
22-
}
2+
private int m;
3+
private int n;
4+
private int[][][] f;
5+
private static final int[] DIRS = {-1, 0, 1, 0, -1};
6+
private static final int MOD = (int) 1e9 + 7;
7+
8+
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
9+
this.m = m;
10+
this.n = n;
11+
f = new int[m + 1][n + 1][maxMove + 1];
12+
for (var a : f) {
13+
for (var b : a) {
14+
Arrays.fill(b, -1);
2315
}
24-
f = temp;
2516
}
17+
return dfs(startRow, startColumn, maxMove);
18+
}
19+
20+
private int dfs(int i, int j, int k) {
21+
if (i < 0 || i >= m || j < 0 || j >= n) {
22+
return 1;
23+
}
24+
if (f[i][j][k] != -1) {
25+
return f[i][j][k];
26+
}
27+
if (k == 0) {
28+
return 0;
29+
}
30+
int res = 0;
31+
for (int t = 0; t < 4; ++t) {
32+
int x = i + DIRS[t];
33+
int y = j + DIRS[t + 1];
34+
res += dfs(x, y, k - 1);
35+
res %= MOD;
36+
}
37+
f[i][j][k] = res;
2638
return res;
2739
}
28-
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def findPaths(self, m: int, n: int, maxMove: int, startRow: int, startColumn: int) -> int:
3+
@cache
4+
def dfs(i, j, k):
5+
if i < 0 or j < 0 or i >= m or j >= n:
6+
return 1
7+
if k <= 0:
8+
return 0
9+
res = 0
10+
for a, b in [[-1, 0], [1, 0], [0, 1], [0, -1]]:
11+
x, y = i + a, j + b
12+
res += dfs(x, y, k - 1)
13+
res %= mod
14+
return res
15+
16+
mod = 10**9 + 7
17+
return dfs(startRow, startColumn, maxMove)

0 commit comments

Comments
 (0)
Please sign in to comment.