2206번: 벽 부수고 이동하기

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로

www.acmicpc.net


최단거리니깐 BFS로! 부수기 찬스 여부도 함께 저장해준다.

  1. [찬스 없을때, 찬스 있을때]를 저장하는 visited 배열을 생성한다.
  2. queue에는 [x좌표, y좌표, 찬스 여부, 경로]를 저장한다.
  3. 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)
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기