Refactor: Let path decide whether a room can be visited

This commit is contained in:
Sven Weidauer 2021-12-12 12:20:35 +01:00
parent 0e3b825b3b
commit 9f919904ab

View file

@ -21,8 +21,12 @@ struct Day12: Puzzle {
struct Path {
var rooms: [Int] = []
func appending(_ room: Int) -> Path {
Path(rooms: rooms + [room])
func appending(_ room: Int, small: Bool) -> Path? {
guard !small || !rooms.contains(room) else {
return nil
}
return Path(rooms: rooms + [room])
}
}
@ -41,19 +45,13 @@ struct Day12: Puzzle {
return [continuing]
}
let current = continuing.appending(from)
var result: [Path] = []
for next in neighbors(of: from) {
if small.contains(next) && current.rooms.contains(next) {
continue
guard let current = continuing.appending(from, small: small.contains(from)) else {
return []
}
let nextPaths = findPaths(from: next, to: to, continuing: current)
result.append(contentsOf: nextPaths)
return neighbors(of: from).reduce(into: []) { partialResult, next in
partialResult += findPaths(from: next, to: to, continuing: current)
}
return result
}
}