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

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

거대한 주차장

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

요약
자동차와 기둥으로 꽉 찬 격자에서 빈 출구 칸 하나만 이용해 차를 한 대씩 밀어 X 차를 출구까지 옮기는 최소 이동 횟수를 구한다.
난이도

보통10점 중 7점

유형
BFS, 그래프, 그리디, 구현
정답자
아직 제출이 없습니다

문제

존은 거대한 주차장에서 일한다. 주차장은 n×mn \times m 크기의 직사각형이고, 1×11 \times 1 크기의 정사각형 칸 n×mn \times m개로 나뉘어 있다. 모서리 칸 하나는 주차장 출구다.

차가 많아서 차를 빼내는 일은 간단하지 않다. 존이 할 수 있는 일은 차 한 대를 인접한 칸으로 옮기는 것뿐이고, 그 칸이 비어 있어야 한다. 인접한 칸이란 변을 공유하는 칸을 말한다. 그런데 주차장에 기둥이 있어서 문제가 더 어려워진다. 기둥이 있는 칸에는 차를 놓을 수 없다. 주차장은 차와 기둥으로 가득 차 있고, 유일하게 비어 있는 자리는 주차장 출구다. 존의 목표는 차 한 대를 주차장 밖으로 빼내는 것이다. 그가 해야 할 최소 행동 횟수를 구하자.

입력

첫째 줄에 주차장의 크기 nn, mm이 주어진다. (1≤n,m≤501 \le n, m \le 50) 이어서 mm개의 문자로 이루어진 줄이 nn개 주어진다. 문자 <<.>>는 빈 칸을 뜻하며, 유일한 빈 칸은 주차장 출구다. 문자 <<#>>는 기둥을 뜻한다. 기둥은 옮길 수 없고, 기둥이 있는 칸에 차를 놓을 수도 없다. 문자 <<c>>는 자동차를 뜻한다. 문자 <<X>>는 주차장 밖으로 빼내야 하는 자동차다. 자동차가 주차장 출구에 도달하는 순간 그 자동차는 빠져나온 것으로 본다. nn, mm 중 적어도 하나는 1보다 크고, 문자 <<.>>와 <<X>>는 각각 입력에 정확히 한 번씩 나타난다. 문자 <<.>>는 항상 주차장의 왼쪽 위 모서리에 있다.

출력

차를 빼낼 수 없으면 <<Impossible>> 한 단어를 출력한다. 그렇지 않으면 차를 빼내는 데 필요한 최소 행동 횟수를 한 줄에 출력한다.

예제2

  1. 예제 1

    입력
    3 3
    .#X
    ccc
    c#c
    
    예상 출력
    Impossible
    
  2. 예제 2

    입력
    2 3
    .cX
    ccc
    
    예상 출력
    7