[백준] 14923번 - 미로 탈출

chanyeong kim·2022년 11월 28일
0

백준

목록 보기
186/200
post-thumbnail

📩 출처

문제

홍익이는 사악한 마법사의 꾐에 속아 N x M 미로 (Hx, Hy) 위치에 떨어졌다. 다행히도 홍익이는 마법사가 만든 미로의 탈출 위치(Ex, Ey)를 알고 있다. 하지만 미로에는 곳곳에 마법사가 설치한 벽이 있어 홍익이가 탈출하기 어렵게 하고 있다.

홍익이는 마법사의 연구실에서 훔친 지팡이가 있어, 벽을 길로 만들 수 있다. 그렇지만, 안타깝게도 마법의 지팡이는 단 한 번만 사용할 수 있다.

이때, 홍익이를 도와 미로에서 탈출할 수 있는지 알아보고, 할 수 있다면 가장 빠른 경로의 거리 D는 얼마인지 알아보자.

인접한 칸으로 이동하는데 똑같은 시간이 들고, 벽을 부수는 데 시간이 걸리지 않는다.

입력

N M
Hx Hy
Ex Ey
N X M 행렬

출력

D (탈출 할 수 없다면, -1을 출력한다.)

👉 생각

  • 벽 부수고 이동하기 문제랑 거의 똑같은 문제!
  • 방문 체크 배열을 3차원으로 만들어서 각 지점을 방문할 때 0번 째는 그냥 통과, 1번 째는 벽을 부수고 통과했다는 것을 체크 한다.
  • 시작 지점에서 너비 우선 탐색을 하면서, 벽을 부수고 왔을 때 그렇지 않을 때를 체크하고 가장 먼저 도착했을 때 방문 배열의 값을 출력한다.
from collections import deque
import sys

def bfs(x, y):
    q = deque([(x, y, 0)])
    visited[x][y][0] = 1
    while q:
        x, y, check = q.popleft()
        if x == ex-1 and y == ey-1:
            return visited[x][y][check] - 1

        for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
            nx, ny = x + dx, y + dy
            if 0 <= nx < n and 0 <= ny < m and not arr[nx][ny] and not visited[nx][ny][check]:
                q.append((nx, ny, check))
                visited[nx][ny][check] = visited[x][y][check] + 1

            elif 0 <= nx < n and 0 <= ny < m and arr[nx][ny] and not visited[nx][ny][check] and not check:
                q.append((nx, ny, check+1))
                visited[nx][ny][check+1] = visited[x][y][check] + 1
    return -1

n, m = map(int, input().split())
sx, sy = map(int, input().split())
ex, ey = map(int, input().split())
arr = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
visited = [[[0] * 2 for _ in range(m)] for _ in range(n)]
print(bfs(sx-1, sy-1))

0개의 댓글