프로그래밍/개발

재귀 하노이탑

b1ackhand 2019. 1. 4. 11:28

2019.01.04.

 

하노이탑은 막대 3개가 있고 크기가 다른 원 N개 가 있다.

반지름이 작은우너은 항상 반지름이 자신보다 큰원보다 위에있어야 된다.

이 규칙에 따라 막대 하나에 크기가 다른 원 3개를 껴놓고 다른 막대로 모든 원을 옮기는 것이다.

 

ex)

 

A,B,C라는 막대에 반지름 1,2,3인 3개의 원이 있을때 과정이다.

 

A    B    C

1

2

3

 

A    B    C

3    2    1

 

A    B    C

3    1    

2

 

A    B    C

1    3

2

 

A    B    C

1          2

3

 

A    B    C

1

2

3

 

다음과 같이 진행될때 만약 원이 4개가 있으면 어떻게 될까?

 

ex)

A    B    C

1

2

3

4

 

A    B    C

4    1

2    

3

 

A    B    C

1    4

2

3    

 

A    B    C

1

2

3

4

 

위와 같이 된다. 123을 이동하는 방법은 위에 언급한 방법과 같기 때문에

반복되는 부분이 생긴다.

 

1)작은원반 N-1개 A=>B

2)큰원반 1개 A=>C

3)작은 원반 N-1개 B=>C

 

이에 따라 코드를 짜보면

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define _CRT_SECURE_NO_WARNINGS   
#include <stdio.h>  
 
void Hanoi(int num, char from, char by, char to)
{
    if (num == 1)
    {;
        printf("1을 %c에서 %c로 이동\n", from, to);
    }
    else
    {
        Hanoi(num - 1, from, to, by);
        printf("%d를 %c에서 %c로 이동\n", num, from, to);
        Hanoi(num - 1, by, from, to);
    }
}
 
int main(void
{
    int num;
 
    scanf("%d"&num);
 
    Hanoi(num, 'A''B''C');
 
}


cs

 

 

참고: 윤성우의 열혈 자료구조

 

 

'프로그래밍 > 개발' 카테고리의 다른 글

pwn 할때 쓰는 툴  (0) 2022.08.02
vim사용법  (0) 2022.07.22
추상 자료형과 리스트사용  (0) 2019.01.05
재귀 팩토리얼 피보나치 구현  (0) 2019.01.04
순차 탐색, 이진 탐색 시간복잡도  (0) 2019.01.01