[Gold III] Title: 벽 부수고 이동하기, Time: 5932 ms, Memory: 205044 KB -BaekjoonHub
This commit is contained in:
34
백준/Gold/2206. 벽 부수고 이동하기/README.md
Normal file
34
백준/Gold/2206. 벽 부수고 이동하기/README.md
Normal 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>
|
||||
|
||||
41
백준/Gold/2206. 벽 부수고 이동하기/벽 부수고 이동하기.py
Normal file
41
백준/Gold/2206. 벽 부수고 이동하기/벽 부수고 이동하기.py
Normal 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)
|
||||
Reference in New Issue
Block a user