소프트웨어 개발/Algorithm

하노이탑 임시

늘근이 2016. 3. 29. 22:42

package algo;

 

import java.util.Stack;

 

public class Hanoi {

     public static void main(String[] args) {

           int n = 3;

           Tower[] towers = new Tower[n];

           for (int i = n - 1; i >= 0; i--) {

                towers[0].add(i);

           }

           towers[0].moveDisks(n, towers[2], towers[1]);

     }

    

    

     class Tower {

           private Stack<Integer> disks;

           private int index;

          

           public Tower(int i) {

                disks = new Stack<Integer>();

                index = 1;

           }

          

           public int getIndex() {

                return index;

           }

          

           public void add(int d) {

                if (!disks.isEmpty() && disks.peek() <= d) {

                     System.out.println("Error placing disk" + d);

                }else {

                     disks.push(d);

                }

           }

          

           public void moveTopTo(Tower t) {

                int top = disks.pop();

                t.add(top);

                System.out.println("move disk" + top + "from" + getIndex() + "to" + t.getIndex());

               

           }

          

           public void moveDisks(int n, Tower destination, Tower buffer) {

                if (n > 0) {

                     moveDisks(n - 1, buffer, destination);

                     moveTopTo(destination);

                     buffer.moveDisks(n - 1, destination, this);

                }

           }

          

     }

}

 

탑을 놓을 수 있는 곳이 총 A / B / C  라고 한다면, (코드에서는 destination이 C이며 buffer가 B)

1) A에서의 2번부터 n번째까지 n-1개의 원판을 B로 이동

2) A에서의 1번을 C로 이동

3) B에서의 2번부터 n번째까지 n-1개의 원판을 C로 이동

 

여기서 2~n번째는 큰 순위를 말한다. 즉, 제일 커다란 원반은 C로 옮기고 나머지는 Temp에 정렬되어있음을 나타내는 말이다.

세개의 함수가 밑에 등장하는데,

하나는 맨 아래의 원반을 제외하고 모두 버퍼에 정렬되어있게 옮긴다는 뜻이고,

두번째는 제일 큰 원반을 목적지에 가져다놓는다는 뜻이다.

세번째는 버퍼에 있는 디스크를 제일 큰것을 제외하고 모두 C에 가져다 놓는다는 말이다.