만드는 중입니다

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

구슬 옮기기

시간 제한0.5초메모리 제한1024 MB

요약
시작 격자와 목표 격자가 주어질 때, 구슬을 옮기거나 꺼내고 놓아 목표 모양을 만드는 최소 이동 횟수를 구합니다. 불가능하면 -1을 출력합니다.
난이도

보통10점 중 7점

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

구슬 옮기기

한서는 HH행 WW열의 구슬 보드판을 가지고 있다. 각 칸에 구슬이 있으면 1, 비어 있으면 0으로 표시된다. 보드판의 초기 상태가 주어지면, 한서는 구슬을 옮겨서 원하는 모양을 만들려고 한다. 구슬을 옮기는 일은 번거로우므로, 한서는 가능한 한 적은 움직임으로 옮기려고 한다.

한서는 구슬을 한 번 움직일 때 다음 세 가지 행동 중 하나를 할 수 있다.

  1. 구슬을 상하좌우 4방향으로 인접한 빈 칸으로 옮긴다. 구슬을 보드판 바깥으로 옮길 수는 없다.
  2. 원하는 칸의 구슬을 제거하여 저장한다. 저장할 수 있는 구슬의 개수에는 제한이 없지만, 목표 모양을 완성한 시점에는 저장한 구슬이 남아 있으면 안 된다.
  3. 저장한 구슬 중 하나를 원하는 빈 칸에 놓는다.

원하는 모양을 완성할 수 없으면 -1을 출력한다. 완성할 수 있으면 최소 움직임 횟수를 출력한다.

예제4

  1. 예제 1

    입력
    4 3
    0 0 0 0
    0 1 0 0
    1 0 0 0
    0 0 0 1
    0 0 0 0
    0 0 0 1
    
    예상 출력
    4
    
  2. 예제 2

    입력
    3 3
    1 1 0
    0 0 1
    1 1 0
    0 0 1
    1 1 0
    0 0 1
    
    예상 출력
    -1
    
  3. 예제 3

    입력
    2 2
    1 1
    0 0
    1 1
    0 0
    
    예상 출력
    0
    
  4. 예제 4

    입력
    4 4
    0 0 1 0
    1 1 0 0
    0 0 0 0
    0 0 0 1
    1 0 0 0
    0 0 0 0
    1 1 0 0
    0 0 1 0
    
    예상 출력
    5