2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
최단거리니깐 BFS로! 부수기 찬스 여부도 함께 저장해준다.
- [찬스 없을때, 찬스 있을때]를 저장하는 visited 배열을 생성한다.
- queue에는 [x좌표, y좌표, 찬스 여부, 경로]를 저장한다.
- BFS 하기.
import sys
from collections import deque
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
input = sys.stdin.readline
N, M = map(int, input().split())
arr = []
visited = [[[0, 0] for _ in range(M)] for _ in range(N)]
for _ in range(N):
arr.append(list(map(int, input().rstrip())))
queue = deque([[0, 0, 1, 1]])
visited[0][0] = [1, 1]
answer = -1
while queue:
x, y, canBreak, cnt = queue.popleft()
if x == N-1 and y == M-1:
answer = cnt
break
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny][canBreak]:
if arr[nx][ny] == 1 and canBreak == 1:
queue.append([nx, ny, 0, cnt+1])
visited[nx][ny][canBreak] = 1
elif arr[nx][ny] == 0:
queue.append([nx, ny, canBreak, cnt+1])
visited[nx][ny][canBreak] = 1
print(answer)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 13549] 숨바꼭질 3 (python) (0) | 2021.04.13 |
---|---|
[백준 12865] 평범한 배낭 (python) (0) | 2021.04.08 |
[백준 9251] LCS (python) (0) | 2021.04.07 |
[백준 1753] 최단경로 (python) (0) | 2021.03.30 |
[백준 1918] 후위 표기식 (python) (0) | 2021.03.29 |
최근댓글