Skip to content

Commit 9709728

Browse files
committed
bfs 841
1 parent 3a9f414 commit 9709728

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* @lc app=leetcode.cn id=841 lang=golang
3+
*
4+
* [841] 钥匙和房间
5+
*
6+
* https://leetcode.cn/problems/keys-and-rooms/description/
7+
*
8+
* algorithms
9+
* Medium (68.66%)
10+
* Likes: 347
11+
* Dislikes: 0
12+
* Total Accepted: 101.6K
13+
* Total Submissions: 147.8K
14+
* Testcase Example: '[[1],[2],[3],[]]'
15+
*
16+
* 有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0
17+
* 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。
18+
*
19+
* 当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。
20+
*
21+
* 给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回
22+
* false。
23+
*
24+
*
25+
*
26+
*
27+
*
28+
*
29+
* 示例 1:
30+
*
31+
*
32+
* 输入:rooms = [[1],[2],[3],[]]
33+
* 输出:true
34+
* 解释:
35+
* 我们从 0 号房间开始,拿到钥匙 1。
36+
* 之后我们去 1 号房间,拿到钥匙 2。
37+
* 然后我们去 2 号房间,拿到钥匙 3。
38+
* 最后我们去了 3 号房间。
39+
* 由于我们能够进入每个房间,我们返回 true。
40+
*
41+
*
42+
* 示例 2:
43+
*
44+
*
45+
* 输入:rooms = [[1,3],[3,0,1],[2],[0]]
46+
* 输出:false
47+
* 解释:我们不能进入 2 号房间。
48+
*
49+
*
50+
*
51+
*
52+
* 提示:
53+
*
54+
*
55+
* n == rooms.length
56+
* 2 <= n <= 1000
57+
* 0 <= rooms[i].length <= 1000
58+
* 1 <= sum(rooms[i].length) <= 3000
59+
* 0 <= rooms[i][j] < n
60+
* 所有 rooms[i] 的值 互不相同
61+
*
62+
*
63+
*/
64+
package jzoffer
65+
66+
// @lc code=start
67+
func canVisitAllRooms(rooms [][]int) bool {
68+
//
69+
n := len(rooms)
70+
visited := make([]bool, n)
71+
visited[0] = true
72+
73+
q := rooms[0]
74+
for len(q) > 0 {
75+
keys := q
76+
q = []int{}
77+
for _, v := range keys {
78+
if visited[v] {
79+
continue
80+
}
81+
visited[v] = true
82+
q = append(q, rooms[v]...)
83+
}
84+
}
85+
86+
for _, v := range visited {
87+
if !v {
88+
return false
89+
}
90+
}
91+
return true
92+
}
93+
94+
// @lc code=end

0 commit comments

Comments
 (0)