65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
/*
|
|
Keys and Rooms
|
|
|
|
Instructions:
|
|
There are n rooms labeled from 0 to n - 1 and all the rooms are locked except for room 0. Your goal is to visit all the rooms. However, you cannot enter a locked room without having its key.
|
|
|
|
When you visit a room, you may find a set of distinct keys in it. Each key has a number on it, denoting which room it unlocks, and you can take all of them with you to unlock the other rooms.
|
|
|
|
Given an array rooms where rooms[i] is the set of keys that you can obtain if you visited room i, return true if you can visit all the rooms, or false otherwise.
|
|
|
|
Constraints:
|
|
n == rooms.length
|
|
2 <= n <= 1000
|
|
0 <= rooms[i].length <= 1000
|
|
1 <= sum(rooms[i].length) <= 3000
|
|
0 <= rooms[i][j] < n
|
|
All the values of rooms[i] are unique.
|
|
*/
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
func main() {
|
|
res := canVisitAllRooms([][]int{{1}, {2}, {3}, {}})
|
|
fmt.Printf("Example 1 works: %+v\n\n", res)
|
|
|
|
res = canVisitAllRooms([][]int{{1, 3}, {3, 0, 1}, {2}, {0}})
|
|
fmt.Printf("Example 2 works: %+v\n", res)
|
|
}
|
|
|
|
func canVisitAllRooms(rooms [][]int) bool {
|
|
if len(rooms) > 0 && len(rooms[0]) == 0 {
|
|
return false
|
|
}
|
|
|
|
keys := getAllKeys(0, make(map[int]struct{}), rooms)
|
|
keys[0] = struct{}{}
|
|
|
|
for i := 0; i < len(rooms); i++ {
|
|
if _, ok := keys[i]; !ok {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func getAllKeys(index int, seen map[int]struct{}, rooms [][]int) map[int]struct{} {
|
|
keys := map[int]struct{}{}
|
|
|
|
for j := 0; j < len(rooms[index]); j++ {
|
|
if _, ok := seen[rooms[index][j]]; ok {
|
|
continue
|
|
} else {
|
|
seen[rooms[index][j]] = struct{}{}
|
|
}
|
|
keys[rooms[index][j]] = struct{}{}
|
|
insideKeys := getAllKeys(rooms[index][j], seen, rooms)
|
|
for k := range insideKeys {
|
|
keys[k] = struct{}{}
|
|
}
|
|
}
|
|
|
|
return keys
|
|
}
|