만드는 중입니다

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

Car Vet

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

요약
빈칸이 하나뿐인 격자에서 지정한 칸을 비우는 데 필요한 차량 이동 순서를 최소 횟수로 구합니다. 길이가 같으면 차량 번호 사전순으로 가장 앞선 순서를 고르고, 불가능하면 impossible을 출력합니다.
난이도

보통10점 중 7점

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

문제

Bob Roberts는 스스로 Car Vet라고 부르는 사람으로, 사람들이 와서 고장 난 차의 여분 부품을 찾을 수 있는 폐차장을 여러 곳 운영한다. 각 폐차장의 차는 울타리로 둘러싸인 m×nm \times n 격자 공간에 주차되어 있고, 차 한 대는 격자 칸 두 개를 차지한다. 각 폐차장에는 부품 더미(펜더, 8트랙 테이프 플레이어, 휠 커버, 퍼지 다이스 등)가 쌓인 칸이 0개 이상 있으며, 이 칸들은 막혀 있다. 사업이 워낙 잘 되어서 각 폐차장에는 빈 칸이 하나만 남아 있다.

가끔 Bob이나 직원이 부품을 바닥에 떨어뜨리면, 그 부품이 차 아래로 굴러 들어간다. 부품을 되찾는 유일한 방법은 차를 옮겨 길을 여는 것이다. 빈 칸의 위치에 따라 여러 대의 차를 옮겨야 할 수도 있다. 차는 앞뒤로만 움직일 수 있다. 울타리 때문에 차는 폐차장 밖으로 나갈 수 없고, 막힌 칸을 지나갈 수도 없다.

그림 A.1은 예시다. 3행 3열의 차 3 아래로 ambihelical hexnut이 굴러 들어갔다(짙은 회색으로 표시). 빈 칸은 1행 3열에 있고, 막힌 칸은 3행 4열에 있다. 부품을 되찾는 유일한 방법은 차 8, 차 4, 차 3을 순서대로 옮기는 것이다. 빈 칸과 막힌 칸의 위치가 바뀌어 있었다면 부품을 되찾을 수 없었을 것이다.

그림 A.1: 예시 폐차장. 3행 3열 칸을 드러내려면 차 8, 4, 3을 이 순서대로 옮겨야 한다.

입력

첫 줄에 폐차장의 행 수 mm과 열 수 nn을 나타내는 양의 정수가 주어진다 (m,n≤250m, n \le 250). 이어서 mm개의 줄에 각각 nn개의 정수가 주어지며, ii번째 줄의 jj번째 값은 ii행 jj열 칸의 내용이다. 모든 값 vv는 −2≤v≤62 500-2 \le v \le 62\,500 범위에 있다. 0 이상인 값은 그 칸에 고장 난 차의 절반이 있다는 뜻이다. 0 이상인 값은 정확히 두 번 나타나며, 두 칸은 가로 또는 세로로 인접한다. 값 -1은 빈 칸, 값 -2는 막힌 칸이다. 빈 칸은 항상 정확히 하나 있고, 차는 적어도 한 대 있다. 막힌 칸은 0개 이상 있을 수 있다.

마지막 줄에는 드러내려는 칸의 행 번호 rr과 열 번호 cc (1≤r,c≤2501 \le r, c \le 250)가 주어진다. 이 칸에는 항상 차의 일부가 있다.

출력

주어진 칸을 비우기 위해 옮겨야 하는 차의 번호를 옮겨야 하는 순서대로 공백으로 구분하여 한 줄에 출력한다. 가능한 이동 순서가 여럿이면 길이가 가장 짧은 순서를 출력한다. 길이가 같은 순서도 여럿이면 차 번호를 기준으로 사전순으로 앞서는 순서를 출력한다. 해당 칸을 드러낼 수 없으면 impossible을 출력한다.

예제2

  1. 예제 1

    입력
    4 4
    8 8 -1 9
    4 10 10 9
    4 3 3 -2
    16 16 2 2
    3 3
    
    예상 출력
    8 4 3
    
  2. 예제 2

    입력
    4 4
    8 8 -2 9
    4 10 10 9
    4 3 3 -1
    16 16 2 2
    3 3
    
    예상 출력
    impossible