Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /