Skip to content

Commit 674f11d

Browse files
committed
feat: add python and java solutions to lcof problem
添加《剑指 Offer》题解:面试题13. 机器人的运动范围
1 parent 6c7935e commit 674f11d

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# [面试题13. 机器人的运动范围](https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/)
2+
3+
## 题目描述
4+
地上有一个m行n列的方格,从坐标 `[0,0]` 到坐标 `[m-1,n-1]` 。一个机器人从坐标 `[0, 0]` 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 `[35, 37]` ,因为 3+5+3+7=18。但它不能进入方格 `[35, 38]`,因为 3+5+3+8=19。请问该机器人能够到达多少个格子?
5+
6+
**示例 1:**
7+
8+
```
9+
输入:m = 2, n = 3, k = 1
10+
输出:3
11+
```
12+
13+
**示例 2:**
14+
15+
```
16+
输入:m = 3, n = 1, k = 0
17+
输出:1
18+
```
19+
20+
**提示:**
21+
22+
- `1 <= n,m <= 100`
23+
- `0 <= k <= 20`
24+
25+
## 解法
26+
### Python3
27+
```python
28+
class Solution:
29+
30+
def __init__(self):
31+
self._cnt = 0
32+
33+
def movingCount(self, m: int, n: int, k: int) -> int:
34+
self._cnt = 0
35+
visited = [[False for j in range(n)] for i in range(m)]
36+
self.visit(0, 0, m, n, k, visited)
37+
return self._cnt
38+
39+
def visit(self, i, j, m, n, k, visited):
40+
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or self.cal(i, j) > k:
41+
return
42+
visited[i][j] = True
43+
self._cnt += 1
44+
self.visit(i - 1, j, m, n, k, visited)
45+
self.visit(i + 1, j, m, n, k, visited)
46+
self.visit(i, j - 1, m, n, k, visited)
47+
self.visit(i, j + 1, m, n, k, visited)
48+
49+
def cal(self, m, n) -> int:
50+
s = str(m) + str(n)
51+
return sum([int(i) for i in s])
52+
```
53+
54+
### Java
55+
```java
56+
class Solution {
57+
private int cnt;
58+
59+
public int movingCount(int m, int n, int k) {
60+
cnt = 0;
61+
boolean[][] visited = new boolean[m][n];
62+
visit(0, 0, m, n, k, visited);
63+
return cnt;
64+
}
65+
66+
private void visit(int i, int j, int m, int n, int k, boolean[][] visited) {
67+
if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || cal(i, j) > k) {
68+
return;
69+
}
70+
visited[i][j] = true;
71+
++cnt;
72+
visit(i - 1, j, m, n, k, visited);
73+
visit(i + 1, j, m, n, k, visited);
74+
visit(i, j - 1, m, n, k, visited);
75+
visit(i, j + 1, m, n, k, visited);
76+
}
77+
78+
79+
private int cal(int i, int j) {
80+
return cal(i) + cal(j);
81+
}
82+
83+
private int cal(int val) {
84+
int s = 0;
85+
while (val != 0) {
86+
s += (val % 10);
87+
val /= 10;
88+
}
89+
return s;
90+
}
91+
}
92+
```
93+
94+
### ...
95+
```
96+
97+
```
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
private int cnt;
3+
4+
public int movingCount(int m, int n, int k) {
5+
cnt = 0;
6+
boolean[][] visited = new boolean[m][n];
7+
visit(0, 0, m, n, k, visited);
8+
return cnt;
9+
}
10+
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;
16+
++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);
21+
}
22+
23+
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;
32+
}
33+
return s;
34+
}
35+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution:
2+
3+
def __init__(self):
4+
self._cnt = 0
5+
6+
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])

0 commit comments

Comments
 (0)