만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

벽 부수고 이동하기 2

면접 대비

시간 제한2초메모리 제한512 MB

요약
N×M 격자의 왼쪽 위에서 오른쪽 아래로 이동할 때 벽을 최대 K개까지 부수면서 갈 수 있는 최단 경로의 길이를 구한다.
난이도

보통10점 중 6점

유형
BFS, 그래프, 최단 경로, 배열
정답자
아직 제출이 없습니다

문제

N×MN \times M 크기의 행렬로 표현된 맵이 있다. 맵에서 0은 이동할 수 있는 칸이고, 1은 벽이 있어 이동할 수 없는 칸이다. 당신은 (1,1)(1, 1)에서 (N,M)(N, M)까지 최단 경로로 이동하려고 한다. 최단 경로란 맵에서 지나는 칸의 개수가 가장 적은 경로이며, 이 개수에는 시작 칸과 끝 칸도 포함된다.

이동하는 도중에 벽을 부수고 지나가면 경로가 더 짧아진다면, 벽을 최대 KK개까지 부수고 이동해도 된다.

한 칸에서는 상하좌우로 인접한 칸으로 이동할 수 있다.

맵이 주어졌을 때 최단 경로의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 NN (1≤N≤1 0001 \le N \le 1\,000), MM (1≤M≤1 0001 \le M \le 1\,000), KK (1≤K≤101 \le K \le 10)이 주어진다. 다음 NN개의 줄에는 맵이 한 줄에 MM개의 숫자로 공백 없이 주어진다. (1,1)(1, 1)과 (N,M)(N, M)은 항상 0이다.

출력

첫째 줄에 최단 경로의 길이를 출력한다. (N,M)(N, M)에 도달할 수 없으면 -1을 출력한다.

예제3

  1. 예제 1

    입력
    6 4 1
    0100
    1110
    1000
    0000
    0111
    0000
    
    예상 출력
    15
    
  2. 예제 2

    입력
    6 4 2
    0100
    1110
    1000
    0000
    0111
    0000
    
    예상 출력
    9
    
  3. 예제 3

    입력
    4 4 3
    0111
    1111
    1111
    1110
    
    예상 출력
    -1