Skip to content

Commit 08fa6f6

Browse files
committed
feat: update solutions to lcof problem
1 parent 501e6d6 commit 08fa6f6

File tree

3 files changed

+82
-87
lines changed

3 files changed

+82
-87
lines changed

lcof/面试题13. 机器人的运动范围/README.md

+42-44
Original file line numberDiff line numberDiff line change
@@ -25,74 +25,72 @@
2525

2626
## 解法
2727

28+
深度优先搜索 DFS 实现。
29+
2830
<!-- tabs:start -->
2931

3032
### **Python3**
3133

3234
```python
3335
class Solution:
34-
35-
def __init__(self):
36-
self._cnt = 0
37-
36+
cnt = 0
3837
def movingCount(self, m: int, n: int, k: int) -> int:
39-
self._cnt = 0
40-
visited = [[False for j in range(n)] for i in range(m)]
41-
self.visit(0, 0, m, n, k, visited)
42-
return self._cnt
43-
44-
def visit(self, i, j, m, n, k, visited):
45-
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or self.cal(i, j) > k:
46-
return
47-
visited[i][j] = True
48-
self._cnt += 1
49-
self.visit(i - 1, j, m, n, k, visited)
50-
self.visit(i + 1, j, m, n, k, visited)
51-
self.visit(i, j - 1, m, n, k, visited)
52-
self.visit(i, j + 1, m, n, k, visited)
53-
54-
def cal(self, m, n) -> int:
55-
s = str(m) + str(n)
56-
return sum([int(i) for i in s])
38+
def cal(m, n):
39+
s = str(m) + str(n)
40+
return sum([int(i) for i in s])
41+
def dfs(i, j):
42+
if i < 0 or i >= m or j < 0 or j >= n or cal(i, j) > k or visited[i][j]:
43+
return
44+
self.cnt += 1
45+
visited[i][j] = True
46+
dfs(i + 1, j)
47+
dfs(i - 1, j)
48+
dfs(i, j + 1)
49+
dfs(i, j - 1)
50+
self.cnt = 0
51+
visited = [[False for _ in range(n)] for _ in range(m)]
52+
dfs(0, 0)
53+
return self.cnt
5754
```
5855

5956
### **Java**
6057

6158
```java
6259
class Solution {
60+
private int m;
61+
private int n;
62+
private boolean[][] visited;
6363
private int cnt;
64-
6564
public int movingCount(int m, int n, int k) {
65+
visited = new boolean[m][n];
66+
this.m = m;
67+
this.n = n;
6668
cnt = 0;
67-
boolean[][] visited = new boolean[m][n];
68-
visit(0, 0, m, n, k, visited);
69+
dfs(0, 0, k);
6970
return cnt;
7071
}
7172

72-
private void visit(int i, int j, int m, int n, int k, boolean[][] visited) {
73-
if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || cal(i, j) > k) {
74-
return;
75-
}
76-
visited[i][j] = true;
73+
private void dfs(int i, int j, int k) {
74+
if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || cal(i, j) > k) return;
7775
++cnt;
78-
visit(i - 1, j, m, n, k, visited);
79-
visit(i + 1, j, m, n, k, visited);
80-
visit(i, j - 1, m, n, k, visited);
81-
visit(i, j + 1, m, n, k, visited);
76+
visited[i][j] = true;
77+
dfs(i + 1, j, k);
78+
dfs(i - 1, j, k);
79+
dfs(i, j + 1, k);
80+
dfs(i, j - 1, k);
8281
}
8382

84-
8583
private int cal(int i, int j) {
86-
return cal(i) + cal(j);
87-
}
88-
89-
private int cal(int val) {
90-
int s = 0;
91-
while (val != 0) {
92-
s += (val % 10);
93-
val /= 10;
84+
int res = 0;
85+
while (i != 0) {
86+
res += (i % 10);
87+
i /= 10;
88+
}
89+
while (j != 0) {
90+
res += (j % 10);
91+
j /= 10;
9492
}
95-
return s;
93+
return res;
9694
}
9795
}
9896
```
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
11
class Solution {
2+
private int m;
3+
private int n;
4+
private boolean[][] visited;
25
private int cnt;
3-
46
public int movingCount(int m, int n, int k) {
7+
visited = new boolean[m][n];
8+
this.m = m;
9+
this.n = n;
510
cnt = 0;
6-
boolean[][] visited = new boolean[m][n];
7-
visit(0, 0, m, n, k, visited);
11+
dfs(0, 0, k);
812
return cnt;
913
}
1014

11-
private void visit(int i, int j, int m, int n, int k, boolean[][] visited) {
12-
if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || cal(i, j) > k) {
13-
return;
14-
}
15-
visited[i][j] = true;
15+
private void dfs(int i, int j, int k) {
16+
if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || cal(i, j) > k) return;
1617
++cnt;
17-
visit(i - 1, j, m, n, k, visited);
18-
visit(i + 1, j, m, n, k, visited);
19-
visit(i, j - 1, m, n, k, visited);
20-
visit(i, j + 1, m, n, k, visited);
18+
visited[i][j] = true;
19+
dfs(i + 1, j, k);
20+
dfs(i - 1, j, k);
21+
dfs(i, j + 1, k);
22+
dfs(i, j - 1, k);
2123
}
2224

2325
private int cal(int i, int j) {
24-
return cal(i) + cal(j);
25-
}
26-
27-
private int cal(int val) {
28-
int s = 0;
29-
while (val != 0) {
30-
s += (val % 10);
31-
val /= 10;
26+
int res = 0;
27+
while (i != 0) {
28+
res += (i % 10);
29+
i /= 10;
30+
}
31+
while (j != 0) {
32+
res += (j % 10);
33+
j /= 10;
3234
}
33-
return s;
35+
return res;
3436
}
3537
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,19 @@
11
class Solution:
2-
3-
def __init__(self):
4-
self._cnt = 0
5-
2+
cnt = 0
63
def movingCount(self, m: int, n: int, k: int) -> int:
7-
self._cnt = 0
8-
visited = [[False for j in range(n)] for i in range(m)]
9-
self.visit(0, 0, m, n, k, visited)
10-
return self._cnt
11-
12-
def visit(self, i, j, m, n, k, visited):
13-
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or self.cal(i, j) > k:
14-
return
15-
visited[i][j] = True
16-
self._cnt += 1
17-
self.visit(i - 1, j, m, n, k, visited)
18-
self.visit(i + 1, j, m, n, k, visited)
19-
self.visit(i, j - 1, m, n, k, visited)
20-
self.visit(i, j + 1, m, n, k, visited)
21-
22-
def cal(self, m, n) -> int:
23-
s = str(m) + str(n)
24-
return sum([int(i) for i in s])
4+
def cal(m, n):
5+
s = str(m) + str(n)
6+
return sum([int(i) for i in s])
7+
def dfs(i, j):
8+
if i < 0 or i >= m or j < 0 or j >= n or cal(i, j) > k or visited[i][j]:
9+
return
10+
self.cnt += 1
11+
visited[i][j] = True
12+
dfs(i + 1, j)
13+
dfs(i - 1, j)
14+
dfs(i, j + 1)
15+
dfs(i, j - 1)
16+
self.cnt = 0
17+
visited = [[False for _ in range(n)] for _ in range(m)]
18+
dfs(0, 0)
19+
return self.cnt

0 commit comments

Comments
 (0)