하노이의+탑

= 하노이의 탑 = 전설에 따르면 천지 창조시에 가운데에 작은 구멍이 뚫린 64개의 금으로 된 원판이 하노이의 한 사원에 보관되어 있다고 한다. 이들 원판은 어느 것도 크기가 같지 않으며, 다음 그림과 같이 작은 원판이 큰 원판 위에 오도록 포개어져, 첫 번째 기둥에 끼워져 있다고 한다. 이 원판들을 한번에 한 장씩 옮겨 세 번째 기둥으로 모두 옮기는 것이 문제이다. 단 옮기는 과정에 절대 작은 원판 위에 큰 원판이 놓이면 안 된다. 조물주가 승려에게 말하기를 64개의 원판을 모두 옮기면 이 세상을 종말을 맞을 것이라 했다. 세상의 종말을 내심 바라는 당신은, N개의 원판을 가지고 가장 적은 횟수에 원판을 모두 옮기는 방법을 연습하려 한다.

입력
원판의 개수 N(10이하의 정수)이 주어진다.

출력
move A from B to C와 같은 형식으로 출력한다. A는 옮길 원판의 크기, B는 원판이 꽂혀 있는 기둥, C는 A를 옮길 기둥의 번호이다.

입력 예
3

출력 예
move 1 from 1 to 3

move 2 from 1 to 2

move 1 from 3 to 2

move 3 from 1 to 3

move 1 from 2 to 1

move 2 from 2 to 3

move 1 from 1 to 3

Source Code code format="java5" import java.util.Scanner;

public class Hanoi { public static void main(String[] args) { Scanner scan = new Scanner(System.in);

int N = scan.nextInt;

process(N); }

public static void process(int n) { move(n, 1, 3, 2); }

/**    * 원판을 옮긴다. * @param size 옮길 원판의 크기 * @param src 원판이 꽂혀있는 기둥의 번호 * @param des 옮길 기둥의 번호 * @param tmp 임시로 놓을 기둥의 번호 */   public static void move(int size, int src, int des, int tmp) { if(size == 0) { return; }

// 가장 아래의 원판만 남기고 임시 기둥으로 옮긴다. move(size - 1, src, tmp, des);

// 메시지를 출력한다. System.out.println("move " + size + " from " + src + " to " + des);

// 임시 기둥의 원판들을 목적 기둥으로 옮긴다. move(size - 1, tmp, des, src); } } code

Comment 유명한 하노이의 탑 문제이다. 재귀를 공부하면 피보나치 수열과 더불어 꼭 나오는 문제 중의 하나이다. 아직까지 이 풀이 방법 외의 다른 풀이 방법은 못 본 듯하다.