안선생의 개발 블로그

하노이 탑 본문

알고리즘

하노이 탑

안선생 2022. 10. 1. 20:44

하노이 탑에는 조건이 있다.

1. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.

2. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.

 

n개의 원판이 있고 a에서 c까지 보낸다고 했을 떄 예를 보자

 

n이 1인 경우

이 경우는 바로 c까지 보내면 된다. cout << a << " " c;

 

n이 2인 경우

이 경우에는 (n-1)이 a에서 b까지 옮긴다. == top(n-1),a,c,b 

그 다음은 n이 1연 경우랑 마찬가지로 제일 큰 원판을 c까지 보내면 된다.  cout << a << " " c;

마지막으로 (n-1)을 b에서 c까지 옮김 == top(n-1),b,a,c  

여기서 재귀를 볼 수 있다. 더 자세히 보게 n3인경우를 보자.

 

n이 3인경우

(n-1)이 a에서 b까지 옮긴다. == top(n-1),a,c,b  (위에 방법으로 재귀 함수를 통해 알 수 있음)

그 다음은 n이 1연 경우랑 마찬가지로 제일 큰 원판을 c까지 보내면 된다.  cout << a << " " c;

마지막으로 (n-1)을 b에서 c까지 옮김 == top(n-1),b,a,c  

이를 바탕으로 재귀함수 작성한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
void top(int n ,int a,int b ,int c ) // a에서 c까지 
{
    if (n > 0)
    {
        top(n - 1, a, c, b); // n-1은 a에서 b로 보낸다
        cout << a <<" "<< c<<endl// 마지막원판은 a에서 c번째로 
        top(n - 1, b, a, c);  // n-1은 b에서 c로 보낸다.
    }
}
int main()
{
    int n;
    cin >> n;
    top(n,1,2,3);
    return 0;
}
cs

 

'알고리즘' 카테고리의 다른 글

C++ 문자열 Anagram  (0) 2022.10.11
배열 ADT  (0) 2022.10.09
피보나치 3가지 방법  (0) 2022.09.29
재귀의 정적변수  (0) 2022.09.26
재귀 함수  (1) 2022.09.25