πŸ—οΈ Algorithm/🟩 λ°±μ€€

🟩 [λ°±μ€€] [Python] [Gold3] 2206번_λ²½ λΆ€μˆ˜κ³  μ΄λ™ν•˜κΈ°

Dbswnstjd 2023. 4. 17. 10:40

문제

https://www.acmicpc.net/problem/2206

 

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

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

www.acmicpc.net

풀이

# λ°±μ€€ 2206번 문제 - λ²½ λΆ€μˆ˜κ³  μ΄λ™ν•˜κΈ°
from collections import deque

n, m = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, input())))

dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
def bfs(x, y):
    visited = [[[0 for _ in range(2)] for _ in range(m)] for _ in range(n)]
    visited[x][y][0] = 1
    queue = deque()
    queue.append((x, y, 0))
    while queue:
        x, y, wall = queue.popleft()
        if (x, y) == (n-1, m-1):
            return visited[x][y][wall]
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if graph[nx][ny] == 1 and wall == 0 and not visited[nx][ny][1]:
                    queue.append((nx, ny, 1))
                    visited[nx][ny][1] = visited[x][y][0] + 1
                elif graph[nx][ny] == 0 and not visited[nx][ny][wall]:
                    queue.append((nx, ny, wall))
                    visited[nx][ny][wall] = visited[x][y][wall] + 1
    return 0

result = bfs(0, 0)
if result:
    print(result)
else:
    print(-1)

μ΅œλ‹¨κ²½λ‘œλ₯Ό κ΅¬ν•˜λŠ” BFS λ¬Έμ œμ΄μ§€λ§Œ 3차원 배열을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.