[BaekJoon] λ°±μ€€ 4179번 : 뢈!

Updated:

4179번 : 뢈!


μ§€ν›ˆμ΄λŠ” 뢈이 퍼진 곳에 이동 ν•  수 μ—†λ‹€.

문제 μ„€λͺ…이 λΆ€μ‹€ν•΄μ„œ 뢈의 이동 쑰건을 λ”°μ§€λŠ”λ° 쑰금 μ• λ§€ν–ˆλ‹€.

μ§€ν›ˆμ΄κ°€ λΆˆμ— 타기 전에 νƒˆμΆœμ„ ν•΄μ•Όν•˜λ‹ˆ λΆˆμ€ μ§€ν›ˆμ΄κ°€ μžˆλŠ” 곳에도 퍼질 수 μžˆλŠ”μ§€..

뢈이 λ¨Όμ € νΌμ§€λŠ”μ§€.. μ§€ν›ˆμ΄κ°€ λ¨Όμ € 이동을 ν•˜λŠ”μ§€..

μš°μ„  뢈이 μ§€ν›ˆμ΄κ°€ μžˆλŠ” 곳에도 퍼진닀고 ν•˜λ©΄ 주어진 μ˜ˆμ‹œλŠ” 닡이 IMPOSSIBLE 이 λ‚˜μ™€μ•Ό ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ κ²°κ΅­ λΆˆμ€ μ§€ν›ˆμ΄κ°€ μžˆλŠ” κ³³μ—λŠ” 갈 수 μ—†κ³  뢈이 λ¨Όμ € 퍼진 λ’€ μ§€ν›ˆμ΄κ°€ μ΄λ™ν•œ κ²ƒμœΌλ‘œ ν•˜λ©΄ λœλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ νƒˆμΆœ ν–ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— ν˜„μž¬ λ°©λ¬Έν•œ μœ„μΉ˜κ°€ ν•„λ“œ κ°€μž₯자리이고 μ§€ν›ˆμ΄λΌλ©΄ κ±Έλ¦° μ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.


import sys
from collections import deque


def solution():
    dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)]
    character, fires = None, list()
    for i in range(N):
        for j in range(M):
            if field[i][j] == 'J':
                character = ('J', i, j, 0)
            elif field[i][j] == 'F':
                fires.append(('F', i, j, 0))

    visit = dict()
    queue = deque([])
    for fire in fires:
        visit[fire] = True
        queue.append(fire)
    visit[character] = True
    queue.append(character)

    while queue:
        who, now_i, now_j, time = queue.popleft()

        if now_i == 0 or now_i == N - 1 or now_j == 0 or now_j == M - 1:
            if who == 'J':
                return time + 1

        for value in dirs:
            visit_i, visit_j = now_i + value[0], now_j + value[1]
            if 0 <= visit_i < N and 0 <= visit_j < M and (who, visit_i, visit_j, time) not in visit:
                if who == 'F' and field[visit_i][visit_j] == '.':
                    field[visit_i][visit_j] = 'F'
                    visit[('F', visit_i, visit_j, time)] = True
                    queue.append(('F', visit_i, visit_j, time))
                elif who == 'J' and field[visit_i][visit_j] == '.':
                    field[visit_i][visit_j] = 'J'
                    visit[('J', visit_i, visit_j, time + 1)] = True
                    queue.append(('J', visit_i, visit_j, time + 1))

    return "IMPOSSIBLE"


if __name__ == "__main__":
    N, M = map(int, input().split())
    field = [list(sys.stdin.readline()) for _ in range(N)]

    print(solution())



Categories:

Updated:

Leave a comment