거대한 주차장
시간 제한2초메모리 제한512 MB
자동차와 기둥으로 꽉 찬 격자에서 빈 출구 칸 하나만 이용해 차를 한 대씩 밀어 X 차를 출구까지 옮기는 최소 이동 횟수를 구한다.
문제
존은 거대한 주차장에서 일한다. 주차장은 크기의 직사각형이고, 크기의 정사각형 칸 개로 나뉘어 있다. 모서리 칸 하나는 주차장 출구다.
차가 많아서 차를 빼내는 일은 간단하지 않다. 존이 할 수 있는 일은 차 한 대를 인접한 칸으로 옮기는 것뿐이고, 그 칸이 비어 있어야 한다. 인접한 칸이란 변을 공유하는 칸을 말한다. 그런데 주차장에 기둥이 있어서 문제가 더 어려워진다. 기둥이 있는 칸에는 차를 놓을 수 없다. 주차장은 차와 기둥으로 가득 차 있고, 유일하게 비어 있는 자리는 주차장 출구다. 존의 목표는 차 한 대를 주차장 밖으로 빼내는 것이다. 그가 해야 할 최소 행동 횟수를 구하자.
입력
첫째 줄에 주차장의 크기 , 이 주어진다. () 이어서 개의 문자로 이루어진 줄이 개 주어진다. 문자 <<.>>는 빈 칸을 뜻하며, 유일한 빈 칸은 주차장 출구다. 문자 <<#>>는 기둥을 뜻한다. 기둥은 옮길 수 없고, 기둥이 있는 칸에 차를 놓을 수도 없다. 문자 <<c>>는 자동차를 뜻한다. 문자 <<X>>는 주차장 밖으로 빼내야 하는 자동차다. 자동차가 주차장 출구에 도달하는 순간 그 자동차는 빠져나온 것으로 본다. , 중 적어도 하나는 1보다 크고, 문자 <<.>>와 <<X>>는 각각 입력에 정확히 한 번씩 나타난다. 문자 <<.>>는 항상 주차장의 왼쪽 위 모서리에 있다.
출력
차를 빼낼 수 없으면 <<Impossible>> 한 단어를 출력한다. 그렇지 않으면 차를 빼내는 데 필요한 최소 행동 횟수를 한 줄에 출력한다.