본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 14923 미로 탈출

by Alan_Kim 2023. 10. 14.
728x90
반응형

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

 

14923번: 미로 탈출

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

www.acmicpc.net

문제 해결

  • 전형적인 BFS문제
  • 그러나 편하게 BFS를 돌리면 시간초과가 난다.(벽을 한 번만 깰 수 있다는 것을 활용해야함)
  • 그래서 array를 3차원으로 해서 n*m*2차원을 만든다. (board[i][j][k]: (i,j)에 있고 k개의 magic 사용 가능)
  • 도착점 왔으면 최소이동횟수이므로 cnt출력하면 끝

 

CODE

import sys
input = sys.stdin.readline
from collections import deque

def bfs(y,x):
    que = deque()
    que.append((y,x,0,1))
    visited = [[[False for _ in range(2)] for _ in range(m)] for _ in range(n)]
    visited[y][x][1] = True
    while que:
        y, x, cnt, magic = que.popleft()
        if (y, x) == (ey, ex):
            return cnt
        for i in range(4):
            ny, nx = y+dy[i], x + dx[i]
            if 0<=ny<n and 0<=nx<m:
                if visited[ny][nx][magic]:continue
                if board[ny][nx] == 1 and magic==1:
                    visited[ny][nx][0] = True
                    que.append((ny,nx,cnt+1,magic-1))
                elif board[ny][nx] ==0:
                    visited[ny][nx][magic] = True
                    que.append((ny,nx,cnt+1,magic))
    return -1
if __name__=='__main__':
    n, m = map(int, input().split())
    hy, hx = map(int, input().split())
    ey, ex = map(int, input().split())
    hy, hx, ey, ex = hy-1, hx-1, ey-1, ex-1
    board = [list(map(int, input().split())) for _ in range(n)]
    dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
    print(bfs(hy,hx))
728x90
반응형

댓글