이상한 하노이 탑
시간 제한2초메모리 제한512 MB
세 개의 막대에서 임의 반지름의 원판을 정해진 규칙에 따라 옮기며 그 이동 순서를 출력하는 시뮬레이션 문제이다.
문제
장대가 세 개 있고, 첫 번째 장대에 원판 개가 쌓여 있다. 원판은 한 번에 한 개씩만 옮긴다. 한 번의 이동은 어떤 장대의 맨 위 원판을 다른 장대의 맨 위에 올려놓는 것이다.
승민이는 고전 하노이 탑 문제를 두 군데 바꿔서 이상한 하노이 탑 문제를 만들었다. 첫째, "쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다(중간 과정 역시 그래야 한다)"라는 조건을 없앴다. 옮기는 도중에는 반경이 큰 원판을 작은 원판 위에 올려도 된다. 둘째, 첫 번째 장대의 원판이 반경과 상관없이 아무 순서로나 놓여 있다.
목표는 원판 개를 모두 세 번째 장대로 옮기는 것이다. 마지막 상태에서 세 번째 장대의 반경은 아래에서 위로 가면서 커지지 않아야 한다. 즉 자기보다 반경이 작은 원판 위에 놓인 원판이 하나도 없어야 한다.
승민이는 이 문제를 진수에게 주면서 원판을 옮긴 횟수가 12345 이하이면 피자를 사주기로 했다. 진수가 피자를 먹도록 도와주자.
입력
첫째 줄에 원판의 개수 ()이 주어진다.
둘째 줄에 첫 번째 장대에 쌓인 원판의 반경 ()이 공백을 두고 주어진다. 제일 아래에 있는 원판의 반경부터 차례로 주어진다. 반경이 같은 원판이 여러 개 있을 수 있다.
출력
답이 여러 가지인 문제이므로, 다음 절차가 만들어내는 이동 순서를 그대로 출력한다. 첫 번째 장대나 두 번째 장대에 원판이 하나라도 남아 있는 동안 아래 네 단계를 반복한다.
- 첫 번째 장대와 두 번째 장대에 남아 있는 원판의 반경 중 가장 큰 값을 이라 하자.
- 에 대해, 번째 장대에서 반경이 인 원판 중 가장 위에 있는 원판보다 위에 쌓여 있는 원판의 개수를 라 하자. 번째 장대에 반경이 인 원판이 없으면 로 둔다.
- 이면 , 로 두고, 아니면 , 로 둔다.
- 번째 장대의 맨 위 원판의 반경이 이면 그 원판을 세 번째 장대로 옮기고, 아니면 번째 장대의 맨 위 원판을 번째 장대로 옮긴다.
첫째 줄에 이 절차가 수행한 이동 횟수 를 출력한다. 다음 개 줄에 이동을 순서대로 A B () 형식으로 출력한다. 번째 장대 맨 위에 있는 원판 하나를 번째 장대 맨 위로 옮긴다는 뜻이다. 이 절차는 항상 번 이내에 끝나므로 가 언제나 성립한다.
힌트
아래 그림은 예제를 푸는 과정이다.
