[백준] 24463번 - 미로

chanyeong kim·2022년 9월 13일
0

백준

목록 보기
161/200
post-thumbnail

📩 출처

문제

크기가 N×MN \times M인 미로가 있다. 미로는 격자 형태이고 .과 +로 이루어져 있다. .은 지나갈 수 있는 길을, +는 지나갈 수 없는 벽을 의미한다. 우리는 미로가 입력으로 주어지면, 미로의 두 구멍을 최단 거리로 연결할 때 지나지 않는 길을 표시할 것이다.

미로의 가장자리에 존재하는 .이 미로의 구멍이다. 항상 두 개만 주어지며, 한 구멍에서 다른 구멍으로 최단 경로로 이동해야 한다. 미로의 두 구멍은 서로 이웃하지 않는다.

두 구멍 사이를 최단 경로로 이동할 때 사용하지 않은 길은 @로 표시해야 한다.

주어진 미로를 최단 거리로 이동할 때 사용하지 않은 길을 찾는 프로그램을 작성하시오.

입력

첫 번째 줄에는 미로의 크기 N,MN, M이 주어진다. (3N,M2,001(3 \le N, M \le 2,001, N,MN, M은 홀수))

두 번째 줄부터는 미로의 정보가 주어진다. 두 번째 줄부터 NN줄에 거쳐 각 줄에는 길이가 MM이고 .과 +만으로 이루어진 문자열이 주어진다.

같은 지점으로 돌아오는 길이 존재하지 않고, 두 구멍 사이를 이동할 수 있는 미로만 주어진다.

출력

주어진 미로를 최단 거리로 이동하는 데 사용하지 않은 길을 @로 표시한 결과를 출력한다.

👉 생각

  • 시간초과 뚫기 힘들었던 문제였다. 일단 .인 곳을 다 @로 바꿔주고, 시작 지점에서 끝 지점 까지 깊이 우선으로 한 큐에 갔을 경우 지나간 경로는 .으로 남지만, 그렇지 않은 경우는 @으로 다시 바꾸어준다.
import sys
sys.setrecursionlimit(10000000)
def dfs(x, y):
    if x == end1 and y == end2:
        return True

    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 arr[nx][ny] == '@':
            arr[nx][ny] = '.'
            if dfs(nx, ny):
                return True
            arr[nx][ny] = '@'
    return False
n, m = map(int, input().split())
arr = [list(input()) for _ in range(n)]
visited = [[0] * m for _ in range(n)]
res = []
for i in range(n):
    for j in range(m):
        if arr[i][j] == ".":
            if i == 0 or i == n - 1 or j == 0 or j == m - 1:
                res.append((i, j))
            arr[i][j] = "@"

start1, start2 = res[0]
end1, end2 = res[1]

answer = dfs(start1, start2)
arr[start1][start2] = '.'

for i in arr:
    print(''.join(i))

0개의 댓글