[Gold III] Title: 벽 부수고 이동하기, Time: 5932 ms, Memory: 205044 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-17 19:35:24 +09:00
parent 0300649673
commit ef10ed7936
2 changed files with 75 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
# [Gold III] 벽 부수고 이동하기 - 2206
[문제 링크](https://www.acmicpc.net/problem/2206)
### 성능 요약
메모리: 205044 KB, 시간: 5932 ms
### 분류
너비 우선 탐색, 그래프 이론, 그래프 탐색
### 제출 일자
2025년 3월 17일 19:34:49
### 문제 설명
<p>N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다.</p>
<p>만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다.</p>
<p>한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다.</p>
<p>맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오.</p>
### 입력
<p>첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.</p>
### 출력
<p>첫째 줄에 최단 거리를 출력한다. 불가능할 때는 -1을 출력한다.</p>

View File

@@ -0,0 +1,41 @@
import sys
from collections import deque
from collections import defaultdict
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
graph = defaultdict(list)
n, m = map(int, input().split())
arr = []
for i in range(n):
arr.append(list(map(int, input().strip())))
dist = [[[0 for _ in range(2)] for _ in range(m)] for _ in range(n)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
now_x, now_y = 0, 0
q = deque([(0, 0, False)])
dist[0][0][0] = 1
while q:
x, y, jump = q.popleft()
if x == m-1 and y == n-1:
print(dist[y][x][jump])
sys.exit(0)
for dx, dy in ((x+1, y), (x, y+1), (x-1, y), (x, y-1)):
if 0<=dx<m and 0<=dy<n:
if arr[dy][dx] == 0 and dist[dy][dx][jump] == 0:
q.append((dx, dy, jump))
dist[dy][dx][jump] = dist[y][x][jump] + 1
elif arr[dy][dx] == 1 and jump == False and dist[dy][dx][1] == 0:
q.append((dx, dy, True))
dist[dy][dx][1] = dist[y][x][jump] + 1
print(-1)