아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

만들어진 신

시간 제한1초메모리 제한128 MB

요약
작은 격자에서 빈 칸을 제외한 각 원자가 번호가 붙은 전자를 하나씩 갖고 있을 때, 전자를 빈 이웃으로 밀어 각자 자기 번호의 원자로 보내는 최소 이동 수를 구한다.
난이도

보통10점 중 7점

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

문제

당신은 우주를 만드는 신이다. 실리콘 결정을 배치하던 중 문제가 생겼다. 알루미늄 불순물이 실리콘의 전자를 빼앗아 갔고, 결정들이 원래의 전자를 돌려달라고 아우성친다. 다행히 문제를 일찍 발견해 결정은 아직 작다. 신이라도 시간이 넉넉하지 않으니, 가장 적은 이동 횟수로 모든 전자를 제자리에 돌려놓아야 한다.

전자를 옮기는 방법은 하나뿐이다. 전자가 있는 원자에서, 전자가 없는 이웃 원자로 전자 하나를 옮긴다. 즉 빈자리로 이웃한 전자를 밀어 넣는 것이며, 한 번의 이동이란 이런 옮김 한 번을 뜻한다.

결정 격자는 평면 직사각형 격자로 생각한다. 각 원자는 상하좌우 4개의 이웃과 연결된다. 격자의 크기가 hh행 ww열일 때 원자의 개수는 n=h×wn = h \times w이고, 원자에는 00부터 n−1n-1까지 번호가 붙는다. ii행 jj열(행과 열은 00부터 센다)에 있는 원자의 번호는 i×w+ji \times w + j이다.

전자에는 11부터 n−1n-1까지 번호가 붙어 있고, 정확히 한 원자에는 전자가 없다(격자에서 00으로 표시). 목표는 각 전자 kk를 같은 번호의 원자 kk로 옮기고, 00번 원자는 전자가 없는 상태로 만드는 것이다. 이렇게 만들기 위한 최소 이동 횟수를 구하라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 두 정수 hh와 ww가 주어진다 (2≤h,w≤52 \le h, w \le 5, h×w≤10h \times w \le 10). 이어지는 hh개의 줄에는 각각 ww개의 정수가 주어지며, 해당 격자 위치에 놓인 전자의 번호를 나타낸다. 00은 전자가 없는 원자를 뜻한다.

한 줄에 0 0만 주어지면 입력이 끝난다.

출력

각 테스트 케이스마다, 모든 전자를 같은 번호의 원자로 되돌리는 데 필요한 최소 이동 횟수를 한 줄에 출력한다.

힌트

예제2

  1. 예제 1

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

    입력
    2 2
    0 1
    2 3
    0 0
    
    예상 출력
    0