https://www.acmicpc.net/problem/4179
4179번: 불!
입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다. 각각의 문자
www.acmicpc.net
import Foundation
var demessions = readLine()!
.split(separator: " ")
.compactMap { Int($0) }
let N = demessions.first!
let M = demessions.last!
let dx = [1, 0, -1, 0]
let dy = [0, 1, 0, -1]
var boards: [[String]] = []
var jihoonQueue: [(Int, Int)] = []
var jihoonBoards: [[Int]] = Array(repeating: Array(repeating: -1, count: M), count: N)
var fireQueue: [(Int, Int)] = []
var fireBoards: [[Int]] = Array(repeating: Array(repeating: -1, count: M), count: N)
for i in 0..<N {
let input = readLine()!.map { String($0) }
boards.append(input)
for j in 0..<input.count {
if input[j] == "F" {
fireQueue.append((i, j))
fireBoards[i][j] = 0
}
if input[j] == "J" {
jihoonQueue.append((i, j))
jihoonBoards[i][j] = 0
}
}
}
func fire() {
var index = 0
while index < fireQueue.count {
let (x, y) = fireQueue[index]
index += 1
for dir in 0..<4 {
let nx = x + dx[dir]
let ny = y + dy[dir]
if (0..<N ~= nx) && (0..<M ~= ny) && boards[nx][ny] != "#" && fireBoards[nx][ny] < 0 {
fireQueue.append((nx, ny))
fireBoards[nx][ny] = fireBoards[x][y] + 1
}
}
}
}
func jihoon() {
var index = 0
while index < jihoonQueue.count {
let (x, y) = jihoonQueue[index]
index += 1
for dir in 0..<4 {
let nx = x + dx[dir]
let ny = y + dy[dir]
if !(0..<N ~= nx) || !(0..<M ~= ny) {
print(jihoonBoards[x][y] + 1)
return
}
if jihoonBoards[nx][ny] >= 0 || boards[nx][ny] == "#" { continue }
if fireBoards[nx][ny] != -1 && fireBoards[nx][ny] <= jihoonBoards[x][y] + 1 { continue }
jihoonQueue.append((nx, ny))
jihoonBoards[nx][ny] = jihoonBoards[x][y] + 1
}
}
print("IMPOSSIBLE")
}
fire()
jihoon()
'백준 > 골드' 카테고리의 다른 글
[Swift] 5427번 : 불 (0) | 2024.03.18 |
---|---|
[Swift] 7569번 : 토마토 (0) | 2024.03.18 |
[Swift] 10026번 : 적록색약 (0) | 2024.03.18 |
[Swift] 7576번 : 토마토 (0) | 2024.03.18 |
[Swift] 2493번 : 탑 (0) | 2024.01.12 |