택시짱의 개발 노트

[백준] - 미로 탈출 본문

알고리즘

[백준] - 미로 탈출

택시짱 2021. 8. 29. 16:52

링크

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

 

14923번: 미로 탈출

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

www.acmicpc.net

 

 

풀이

BFS 를 이용하여 최소 경로를 찾고

벽을 부셨는지 여부를 체크하여 해결

 

4번 제출하고 3번을 틀렸는데 이런 상황을 생각하지 못해서 틀렸다.

hx,hy = 1, 1

ex, ey = 1, 4

0 1 1 0

0 1 0 1

0 1 0 0

0 0 0 0

 

이때 BFS를 돌리면 [1, 1]의 벽을 부시고 [2, 3]으로 이동하는데 이때 이미 벽을 부셨기 때문에

더 이상 벽을 부실수가 없기 때문에 목적지로 가지 못하는 상황때문에 3번 틀리게 되었는데

해결 방법으로 다음 목적지를 확인 할때 이미 방문 하였더라도 현재 상황에서 벽을 부시지 않았다면

한번 더 이동 할 수 있도록 하였다.

 

 

 

코드

import sys
from collections import deque

INF = 123124123231
VISITED_CHECK = 0
DESTORY_BLOCK = 1
COUNT = 2

dir = [[-1, 0], [0, 1], [1, 0], [0, -1]]


def solution(*args):
    n, m, start_x, start_y, ex, ey, board = args
    check_board = [[[False, False, -1] for _ in range(m + 1)] for _ in range(n + 1)]

    dq = deque([[start_x, start_y]])
    check_board[start_x][start_y] = [True, board[start_x][start_y], 0]
    while dq:
        hx, hy = dq.popleft()
        check_board[hx][hy][VISITED_CHECK] = True
        for dx, dy in dir:
            nx, ny = hx + dx, hy + dy
            if nx < 0 or nx >= n or ny < 0 or ny >= m:
                continue
            if check_board[nx][ny][VISITED_CHECK]:
                if not check_board[nx][ny][DESTORY_BLOCK] > check_board[hx][hy][DESTORY_BLOCK]:
                    continue
            if board[nx][ny] == 1 and check_board[hx][hy][DESTORY_BLOCK]:
                continue
            check_board[nx][ny][VISITED_CHECK] = True
            check_board[nx][ny][DESTORY_BLOCK] = check_board[hx][hy][DESTORY_BLOCK]
            check_board[nx][ny][COUNT] = check_board[hx][hy][COUNT] + 1
            if board[nx][ny] == 1:
                check_board[nx][ny][DESTORY_BLOCK] = True
            dq.append([nx, ny])
            if nx == ex and ny == ey:
                return check_board[nx][ny][COUNT]
    return check_board[ex][ey][COUNT]


if __name__ == "__main__":
    n, m = map(int, sys.stdin.readline().split())
    hx, hy = map(int, sys.stdin.readline().split())
    ex, ey = map(int, sys.stdin.readline().split())
    board = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]

    print(solution(n, m, hx - 1, hy - 1, ex - 1, ey - 1, board))

반응형
Comments