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에 가져다 놓는다는 말이다.
'소프트웨어 개발 > Algorithm' 카테고리의 다른 글
0-1 배낭문제 (도둑놈 짐싸기 문제) (3) | 2016.04.04 |
---|---|
이진탐색 구현 (Binary Search) (0) | 2016.04.03 |
판매원 알고리즘 Travelling Salesman Problem (TSP) (0) | 2016.03.20 |
NP, P 문제 (0) | 2016.03.17 |
제일 만족하는 길찾기 문제를 재귀로 풀어보기 (0) | 2015.11.04 |