하노이의 탑
알고리즘 예제에서 단골 문제이다. 그만큼 머리를 많이써야하는 알고리즘 중 하나이다.
하노이의 탑 문제를 해결하는 프로그램을 작성할 때 알고리즘을 짜기 위해 머리를 쥐어짤 필요는 없다.
검색창에 하노이의 탑이라고 검색하면 기본적인 규칙과 풀이순서가 제공된다.
문제
다음 규칙을 지키며 막대A에 쌓여있는 원판 b개를 막대C로 옮기는 것이다.
1. 한 번에 하나의 원판만 이동할 수 있다.
2. 맨 위에 있는 원판만 이동할 수 있다.
3. 크기가 작은 원판 위 에 큰 원판이 쌓일 수 없다.
4. 중간의 막대를 임시적으로 이용할 수 있으나 앞의 조건들을 지켜야한다.
다음 사진은 이해를 돕기위한 원판이 3개일 때의 풀이 과정이다.
위 사진을 분석하여 알고리즘을 도출할 수있다.
막대A에서 C로 모두 옮기기 위해 B를 임시 버퍼로 사용한다.
n-1개의 원판을 A에서 B로 임시로 옮긴다.
n번쨰 원판(재일 큰 원판)을 A에서 C로 옮긴다.
n-1개의 원판을 B에서 C로 옮긴다.
그럼 어떻게 n-1개의 원판을 옮기느냐?
재귀호출을 통해 해결한다.
현재 작성중인 함수의 파라미터를 n-1로 바꾸어 순환호출하면 된다.
소스
1
2
3
4
5
6
7
8
9
10
11
12
13 |
#include <stdio.h>
void hanoi_tower(int n, char from, char tmp, char to) {
if( n==1 ) printf("원판 1을 %c 에서 %c으로 옮긴다.\n",from,to);
else {
hanoi_tower(n-1, from, to, tmp);
printf("원판 %d을 %c에서 %c으로 옮긴다.\n",n, from, to);
hanoi_tower(n-1, tmp, from, to);
}
}
main() {
hanoi_tower(4, 'A', 'B', 'C');
} |
cs |
원판의 이동 과정을 printf문으로 출력하는 소스이다.
필요에 따라 파라미터를 그래픽으로 활용하던
횟수를 카운트하여 몇번 움직여야하는지를 계산하던
본인 능력껏 활용하라.
반응형
'Programming > Algorithm' 카테고리의 다른 글
순환(재귀)과 반복 (0) | 2015.07.11 |
---|---|
순차(절차)지향과 객체지향 프로그래밍 (0) | 2015.07.11 |