Skip to content

Commit 9a9ac14

Browse files
committed
feat: add solutions to lc problem: No.2061
No.2061.Number of Spaces Cleaning Robot Cleaned
1 parent 13bd762 commit 9a9ac14

File tree

6 files changed

+329
-2
lines changed

6 files changed

+329
-2
lines changed

solution/2000-2099/2061.Number of Spaces Cleaning Robot Cleaned/README.md

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,139 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:DFS 模拟**
65+
66+
我们从起点 $(0, 0)$ 开始模拟机器人的清扫过程,每次清扫当前位置,然后向前走一步,如果碰到墙壁或者已经清扫过的位置,就顺时针旋转 90 度,然后继续清扫。
67+
68+
过程中,我们用一个三元组 $(i, j, k)$ 表示机器人当前的位置 $(i, j)$ 和朝向 $k$,其中 $k$ 的取值范围为 $0, 1, 2, 3$,分别表示朝右、朝下、朝左、朝上。我们用一个集合 `vis` 记录所有访问过的状态三元组。
69+
70+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为房间的行数和列数。
71+
6472
<!-- tabs:start -->
6573

6674
### **Python3**
6775

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

7078
```python
71-
79+
class Solution:
80+
def numberOfCleanRooms(self, room: List[List[int]]) -> int:
81+
def dfs(i, j, k):
82+
if (i, j, k) in vis:
83+
return
84+
nonlocal ans
85+
ans += room[i][j] == 0
86+
room[i][j] = -1
87+
vis.add((i, j, k))
88+
x, y = i + dirs[k], j + dirs[k + 1]
89+
if 0 <= x < len(room) and 0 <= y < len(room[0]) and room[x][y] != 1:
90+
dfs(x, y, k)
91+
else:
92+
dfs(i, j, (k + 1) % 4)
93+
94+
vis = set()
95+
dirs = (0, 1, 0, -1, 0)
96+
ans = 0
97+
dfs(0, 0, 0)
98+
return ans
7299
```
73100

74101
### **Java**
75102

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

78105
```java
106+
class Solution {
107+
private boolean[][][] vis;
108+
private int[][] room;
109+
private int ans;
110+
111+
public int numberOfCleanRooms(int[][] room) {
112+
vis = new boolean[room.length][room[0].length][4];
113+
this.room = room;
114+
dfs(0, 0, 0);
115+
return ans;
116+
}
117+
118+
private void dfs(int i, int j, int k) {
119+
if (vis[i][j][k]) {
120+
return;
121+
}
122+
int[] dirs = {0, 1, 0, -1, 0};
123+
ans += room[i][j] == 0 ? 1 : 0;
124+
room[i][j] = -1;
125+
vis[i][j][k] = true;
126+
int x = i + dirs[k], y = j + dirs[k + 1];
127+
if (x >= 0 && x < room.length && y >= 0 && y < room[0].length && room[x][y] != 1) {
128+
dfs(x, y, k);
129+
} else {
130+
dfs(i, j, (k + 1) % 4);
131+
}
132+
}
133+
}
134+
```
135+
136+
### **C++**
137+
138+
```cpp
139+
class Solution {
140+
public:
141+
int numberOfCleanRooms(vector<vector<int>>& room) {
142+
int m = room.size(), n = room[0].size();
143+
bool vis[m][n][4];
144+
memset(vis, false, sizeof(vis));
145+
int dirs[5] = {0, 1, 0, -1, 0};
146+
int ans = 0;
147+
function<void(int, int, int)> dfs = [&](int i, int j, int k) {
148+
if (vis[i][j][k]) {
149+
return;
150+
}
151+
ans += room[i][j] == 0;
152+
room[i][j] = -1;
153+
vis[i][j][k] = true;
154+
int x = i + dirs[k], y = j + dirs[k + 1];
155+
if (x >= 0 && x < m && y >= 0 && y < n && room[x][y] != 1) {
156+
dfs(x, y, k);
157+
} else {
158+
dfs(i, j, (k + 1) % 4);
159+
}
160+
};
161+
dfs(0, 0, 0);
162+
return ans;
163+
}
164+
};
165+
```
79166
167+
### **Go**
168+
169+
```go
170+
func numberOfCleanRooms(room [][]int) (ans int) {
171+
m, n := len(room), len(room[0])
172+
vis := make([][][4]bool, m)
173+
for i := range vis {
174+
vis[i] = make([][4]bool, n)
175+
}
176+
dirs := [5]int{0, 1, 0, -1, 0}
177+
var dfs func(i, j, k int)
178+
dfs = func(i, j, k int) {
179+
if vis[i][j][k] {
180+
return
181+
}
182+
if room[i][j] == 0 {
183+
ans++
184+
room[i][j] = -1
185+
}
186+
vis[i][j][k] = true
187+
x, y := i+dirs[k], j+dirs[k+1]
188+
if x >= 0 && x < m && y >= 0 && y < n && room[x][y] != 1 {
189+
dfs(x, y, k)
190+
} else {
191+
dfs(i, j, (k+1)%4)
192+
}
193+
}
194+
dfs(0, 0, 0)
195+
return
196+
}
80197
```
81198

82199
### **...**

solution/2000-2099/2061.Number of Spaces Cleaning Robot Cleaned/README_EN.md

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,122 @@ The robot has cleaned 1 space, so return 1.
6060
### **Python3**
6161

6262
```python
63-
63+
class Solution:
64+
def numberOfCleanRooms(self, room: List[List[int]]) -> int:
65+
def dfs(i, j, k):
66+
if (i, j, k) in vis:
67+
return
68+
nonlocal ans
69+
ans += room[i][j] == 0
70+
room[i][j] = -1
71+
vis.add((i, j, k))
72+
x, y = i + dirs[k], j + dirs[k + 1]
73+
if 0 <= x < len(room) and 0 <= y < len(room[0]) and room[x][y] != 1:
74+
dfs(x, y, k)
75+
else:
76+
dfs(i, j, (k + 1) % 4)
77+
78+
vis = set()
79+
dirs = (0, 1, 0, -1, 0)
80+
ans = 0
81+
dfs(0, 0, 0)
82+
return ans
6483
```
6584

6685
### **Java**
6786

6887
```java
88+
class Solution {
89+
private boolean[][][] vis;
90+
private int[][] room;
91+
private int ans;
92+
93+
public int numberOfCleanRooms(int[][] room) {
94+
vis = new boolean[room.length][room[0].length][4];
95+
this.room = room;
96+
dfs(0, 0, 0);
97+
return ans;
98+
}
99+
100+
private void dfs(int i, int j, int k) {
101+
if (vis[i][j][k]) {
102+
return;
103+
}
104+
int[] dirs = {0, 1, 0, -1, 0};
105+
ans += room[i][j] == 0 ? 1 : 0;
106+
room[i][j] = -1;
107+
vis[i][j][k] = true;
108+
int x = i + dirs[k], y = j + dirs[k + 1];
109+
if (x >= 0 && x < room.length && y >= 0 && y < room[0].length && room[x][y] != 1) {
110+
dfs(x, y, k);
111+
} else {
112+
dfs(i, j, (k + 1) % 4);
113+
}
114+
}
115+
}
116+
```
117+
118+
### **C++**
119+
120+
```cpp
121+
class Solution {
122+
public:
123+
int numberOfCleanRooms(vector<vector<int>>& room) {
124+
int m = room.size(), n = room[0].size();
125+
bool vis[m][n][4];
126+
memset(vis, false, sizeof(vis));
127+
int dirs[5] = {0, 1, 0, -1, 0};
128+
int ans = 0;
129+
function<void(int, int, int)> dfs = [&](int i, int j, int k) {
130+
if (vis[i][j][k]) {
131+
return;
132+
}
133+
ans += room[i][j] == 0;
134+
room[i][j] = -1;
135+
vis[i][j][k] = true;
136+
int x = i + dirs[k], y = j + dirs[k + 1];
137+
if (x >= 0 && x < m && y >= 0 && y < n && room[x][y] != 1) {
138+
dfs(x, y, k);
139+
} else {
140+
dfs(i, j, (k + 1) % 4);
141+
}
142+
};
143+
dfs(0, 0, 0);
144+
return ans;
145+
}
146+
};
147+
```
69148
149+
### **Go**
150+
151+
```go
152+
func numberOfCleanRooms(room [][]int) (ans int) {
153+
m, n := len(room), len(room[0])
154+
vis := make([][][4]bool, m)
155+
for i := range vis {
156+
vis[i] = make([][4]bool, n)
157+
}
158+
dirs := [5]int{0, 1, 0, -1, 0}
159+
var dfs func(i, j, k int)
160+
dfs = func(i, j, k int) {
161+
if vis[i][j][k] {
162+
return
163+
}
164+
if room[i][j] == 0 {
165+
ans++
166+
room[i][j] = -1
167+
}
168+
vis[i][j][k] = true
169+
x, y := i+dirs[k], j+dirs[k+1]
170+
if x >= 0 && x < m && y >= 0 && y < n && room[x][y] != 1 {
171+
dfs(x, y, k)
172+
} else {
173+
dfs(i, j, (k+1)%4)
174+
}
175+
}
176+
dfs(0, 0, 0)
177+
return
178+
}
70179
```
71180

72181
### **...**
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
int numberOfCleanRooms(vector<vector<int>>& room) {
4+
int m = room.size(), n = room[0].size();
5+
bool vis[m][n][4];
6+
memset(vis, false, sizeof(vis));
7+
int dirs[5] = {0, 1, 0, -1, 0};
8+
int ans = 0;
9+
function<void(int, int, int)> dfs = [&](int i, int j, int k) {
10+
if (vis[i][j][k]) {
11+
return;
12+
}
13+
ans += room[i][j] == 0;
14+
room[i][j] = -1;
15+
vis[i][j][k] = true;
16+
int x = i + dirs[k], y = j + dirs[k + 1];
17+
if (x >= 0 && x < m && y >= 0 && y < n && room[x][y] != 1) {
18+
dfs(x, y, k);
19+
} else {
20+
dfs(i, j, (k + 1) % 4);
21+
}
22+
};
23+
dfs(0, 0, 0);
24+
return ans;
25+
}
26+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func numberOfCleanRooms(room [][]int) (ans int) {
2+
m, n := len(room), len(room[0])
3+
vis := make([][][4]bool, m)
4+
for i := range vis {
5+
vis[i] = make([][4]bool, n)
6+
}
7+
dirs := [5]int{0, 1, 0, -1, 0}
8+
var dfs func(i, j, k int)
9+
dfs = func(i, j, k int) {
10+
if vis[i][j][k] {
11+
return
12+
}
13+
if room[i][j] == 0 {
14+
ans++
15+
room[i][j] = -1
16+
}
17+
vis[i][j][k] = true
18+
x, y := i+dirs[k], j+dirs[k+1]
19+
if x >= 0 && x < m && y >= 0 && y < n && room[x][y] != 1 {
20+
dfs(x, y, k)
21+
} else {
22+
dfs(i, j, (k+1)%4)
23+
}
24+
}
25+
dfs(0, 0, 0)
26+
return
27+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
private boolean[][][] vis;
3+
private int[][] room;
4+
private int ans;
5+
6+
public int numberOfCleanRooms(int[][] room) {
7+
vis = new boolean[room.length][room[0].length][4];
8+
this.room = room;
9+
dfs(0, 0, 0);
10+
return ans;
11+
}
12+
13+
private void dfs(int i, int j, int k) {
14+
if (vis[i][j][k]) {
15+
return;
16+
}
17+
int[] dirs = {0, 1, 0, -1, 0};
18+
ans += room[i][j] == 0 ? 1 : 0;
19+
room[i][j] = -1;
20+
vis[i][j][k] = true;
21+
int x = i + dirs[k], y = j + dirs[k + 1];
22+
if (x >= 0 && x < room.length && y >= 0 && y < room[0].length && room[x][y] != 1) {
23+
dfs(x, y, k);
24+
} else {
25+
dfs(i, j, (k + 1) % 4);
26+
}
27+
}
28+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution:
2+
def numberOfCleanRooms(self, room: List[List[int]]) -> int:
3+
def dfs(i, j, k):
4+
if (i, j, k) in vis:
5+
return
6+
nonlocal ans
7+
ans += room[i][j] == 0
8+
room[i][j] = -1
9+
vis.add((i, j, k))
10+
x, y = i + dirs[k], j + dirs[k + 1]
11+
if 0 <= x < len(room) and 0 <= y < len(room[0]) and room[x][y] != 1:
12+
dfs(x, y, k)
13+
else:
14+
dfs(i, j, (k + 1) % 4)
15+
16+
vis = set()
17+
dirs = (0, 1, 0, -1, 0)
18+
ans = 0
19+
dfs(0, 0, 0)
20+
return ans

0 commit comments

Comments
 (0)