ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

2206번: λ²½ λΆ€μˆ˜κ³  μ΄λ™ν•˜κΈ°

N×M의 ν–‰λ ¬λ‘œ ν‘œν˜„λ˜λŠ” 맡이 μžˆλ‹€. λ§΅μ—μ„œ 0은 이동할 수 μžˆλŠ” 곳을 λ‚˜νƒ€λ‚΄κ³ , 1은 이동할 수 μ—†λŠ” 벽이 μžˆλŠ” 곳을 λ‚˜νƒ€λ‚Έλ‹€. 당신은 (1, 1)μ—μ„œ (N, M)의 μœ„μΉ˜κΉŒμ§€ μ΄λ™ν•˜λ € ν•˜λŠ”λ°, μ΄λ•Œ μ΅œλ‹¨ 경둜��

www.acmicpc.net

 

문제 풀이

 κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ”λ° 이동할 수 없을 경우 λ²½ ν•˜λ‚˜λ₯Ό λΆ€μˆ˜κ³  탐색을 μ΄μ–΄κ°ˆ 수 μžˆλ‹€. 즉, λ²½ ν•˜λ‚˜λ₯Ό λΆ€μˆ  경우 κ°€μž₯ μ΅œλ‹¨ 경둜둜 (N, M)에 λ„μ°©ν•˜λŠ” 경우λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 보톡 μ΅œλ‹¨ 거리λ₯Ό ꡬ할 λ•Œ, 2차원 배열을 μƒμ„±ν•˜μ—¬ μ΄λ™ν•œ 거리λ₯Ό μ€‘μ²©μ‹œμΌœλ©° μ•žμœΌλ‘œ λ‚˜μ•„κ°€λ©° λͺ©μ μ§€μ— λ„μ°©ν•œ 경우 탐색을 μ’…λ£Œν•œλ‹€. λ¬Έμ œμ—μ„œλŠ” 벽을 λΆ€μˆœ κ²½μš°μ™€ λΆ€μˆ˜μ§€ μ•Šμ€ 경우 2κ°€μ§€μ˜ 경우의 μˆ˜κ°€ μ‘΄μž¬ν•˜κΈ°μ— 기쑴에 거리λ₯Ό μ€‘μ²©ν•˜λŠ” 방식이 μ•„λ‹Œ 3차원 배열을 톡해 λΆ€μˆœ κ²½μš°μ— λŒ€ν•œ 경우의 μˆ˜λ„ λ”°λ‘œ μ€‘μ²©μ‹œν‚¨λ‹€.

 

μ½”λ“œ

from sys import stdin
from collections import deque


def visitable(x, y, w):
    return 0 <= x < n and 0 <= y < m and not visited[x][y][w]


def bfs(start):
    q = deque([start])
    dirs = ((-1, 0), (0, 1), (1, 0), (0, -1))

    while q:
        cur_x, cur_y, wall = q.popleft()
        dist = visited[cur_x][cur_y][wall] + 1

        if [cur_x, cur_y] == [n - 1, m - 1]:
            return visited[cur_x][cur_y][wall]

        for x, y in dirs:
            next_x, next_y = cur_x + x, cur_y + y
            if visitable(next_x, next_y, wall):
                if not graph[next_x][next_y]:
                    visited[next_x][next_y][wall] = dist
                    q.append((next_x, next_y, wall))
                elif not wall:
                    visited[next_x][next_y][not wall] = dist
                    q.append((next_x, next_y, not wall))

    return -1


if __name__ == '__main__':
    n, m = map(int, stdin.readline().split())
    graph = [list(map(int, stdin.readline().strip())) for _ in range(n)]
    visited = [[[0, 0] for _ in range(m)] for _ in range(n)]
    visited[0][0] = [1, 1]
    print(bfs((0, 0, 0)))

 

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€