結果
問題 | No.157 2つの空洞 |
ユーザー | conf8o |
提出日時 | 2020-04-10 17:03:01 |
言語 | Swift (5.10.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,961 bytes |
コンパイル時間 | 2,322 ms |
コンパイル使用メモリ | 192,720 KB |
実行使用メモリ | 16,128 KB |
最終ジャッジ日時 | 2024-11-30 17:26:03 |
合計ジャッジ時間 | 3,249 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | AC | 11 ms
15,744 KB |
testcase_03 | AC | 11 ms
15,616 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | AC | 11 ms
15,616 KB |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | AC | 10 ms
15,744 KB |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
ソースコード
import Foundation public struct Deque<T> { private var array: [T?] private var head: Int private var capacity: Int private let originalCapacity: Int public init(_ capacity: Int = 10) { self.capacity = max(capacity, 1) originalCapacity = self.capacity array = [T?](repeating: nil, count: capacity) head = capacity } public var isEmpty: Bool { return count == 0 } public var count: Int { return array.count - head } public mutating func enqueue(_ element: T) { array.append(element) } public mutating func enqueueFront(_ element: T) { if head == 0 { capacity *= 2 let emptySpace = [T?](repeating: nil, count: capacity) array.insert(contentsOf: emptySpace, at: 0) head = capacity } head -= 1 array[head] = element } public mutating func dequeue() -> T? { guard head < array.count, let element = array[head] else { return nil } array[head] = nil head += 1 if capacity >= originalCapacity && head >= capacity*2 { let amountToRemove = capacity + capacity/2 array.removeFirst(amountToRemove) head -= amountToRemove capacity /= 2 } return element } public mutating func dequeueBack() -> T? { if isEmpty { return nil } else { return array.removeLast() } } public func peekFront() -> T? { if isEmpty { return nil } else { return array[head] } } public func peekBack() -> T? { if isEmpty { return nil } else { return array.last! } } } func readInt() -> [Int] { return readLine()!.split(separator: " ").map{Int($0)!} } let line = readInt() let W = line[0] let H = line[1] let maze = (1...H).map { _ in Array(readLine()!) } let directions = [(1,0),(0,1),(-1,0),(0,-1)] func bfs(_ initial: [Int], _ hole: inout Set<[Int]>){ var queue = Deque<[Int]>() queue.enqueue(initial) hole.insert(initial) while let yx = queue.dequeue() { let y = yx[0] let x = yx[1] for d in directions { let y_ = d.0 + y let x_ = d.1 + x if maze[y_][x_] == "#" || hole.contains([y_, x_]) { continue } hole.insert([y_, x_]) queue.enqueue([y_, x_]) } } } func main() { var holes = [Set<[Int]>(), Set<[Int]>()] var count = 0 for i in 1..<(H-1) { for j in 1..<(W-1) { if holes.allSatisfy({!$0.contains([i, j])}) && maze[i][j] == "." { bfs([i,j], &holes[count]) count += 1 } if count > 1 { break } } if count > 1 { break } } var ans = 401 for yx1 in holes[0] { for yx2 in holes[1] { let distance = abs(yx1[0] - yx1[1]) + abs(yx2[0] - yx2[1]) if distance < ans { ans = distance } } } print(ans) } main()