ascode 1103 하노이 탑

2 분 소요

문제 설명

하노이 탑은 팩토리얼을 구하는 함수와 함께 재귀함수를 학습할 떄 주로 사용되는 유명한 예제이다.


“고대 인도 베나레스에 있는 한 사원의 이야기”
여기에는 다이아몬드로 이루어진 3개의 기둥이 있고, 그 기둥 중 하나에 가운데에 구멍이 나 기둥에 끼울 수 있게 된 63개(혹은 64개)의 크기가 각각 다른 황금 원반이 꽂혀 있다고 한다. 황금 원반은 가장 아래쪽에 있는 것이 가장 크고 위로 갈수록 점차 작아져 전체적으로 원추형의 탑을 이루고 있는데, 원반은 한번에 하나씩만 옮길 수 있으며 작은 원반 위에 그보다 더 큰 원반을 옮길 수 없다.
이 규칙으로 63(64)개의 원판을 처음 놓여있던 막대에서 다른 막대로 모두 옮기면 탑은 무너지고 세상의 종말이 온다고 한다.


조건을 정리하자면 아래와 같다.

[아래] 한번에 하나의 원판만 이동할 수 있다.
맨 위에 있는 원판만 이동할 수 있다.
크기가 작은 원판 위에 큰 원판이 쌓일 수 없다.
중간의 막대를 임시적으로 이용할 수 있으나 앞의 조건들을 지켜야한다.



위의 조건을 지키며 최소의 이동을 하였을 떄 몇 번을 이동시켜야 하는지 알아보자.

입력 설명

첫줄에 testCase의 수 T(<10)가 입력된다.

이후 T만큼 옮겨야 할 원판의 갯수 N(<=15)가 주어진다.

출력 설명

원판들을 다른 막대로 옮기는데 필요한 최소의 이동 횟수와 방법을 출력한다.

입력 예시

2
3
4 

출력 예시

원판 1을 A 에서 C로 옮긴다
원판 2를 A 에서 B로 옮긴다
원판 1을 C 에서 B로 옮긴다
원판 3를 A 에서 C로 옮긴다
원판 1을 B 에서 A로 옮긴다
원판 2를 B 에서 C로 옮긴다
원판 1을 A 에서 C로 옮긴다
7
원판 1을 A 에서 B로 옮긴다
원판 2를 A 에서 C로 옮긴다
원판 1을 B 에서 C로 옮긴다
원판 3를 A 에서 B로 옮긴다
원판 1을 C 에서 A로 옮긴다
원판 2를 C 에서 B로 옮긴다
원판 1을 A 에서 B로 옮긴다
원판 4를 A 에서 C로 옮긴다
원판 1을 B 에서 C로 옮긴다
원판 2를 B 에서 A로 옮긴다
원판 1을 C 에서 A로 옮긴다
원판 3를 B 에서 C로 옮긴다
원판 1을 A 에서 B로 옮긴다
원판 2를 A 에서 C로 옮긴다
원판 1을 B 에서 C로 옮긴다
15

코드

#include <stdio.h>
int count = 0;
void  check(int n, char a, char b, char c) {
    if (n == 1) {
        printf("원판 1을 %c 에서 %c로 옮긴다\n", a, c);
        count++;
    }
    else {
        check(n - 1, a, c, b);
        printf("원판 %d를 %c 에서 %c로 옮긴다\n", n, a, c);
        check(n - 1, b, a, c);
        count++;
    }
}

int main()
{
    int a, b, c;
    scanf("%d", &a);
    for (int i = 0; i < a; i++)
    {
        scanf("%d", &b);
        check(b, 'A', 'B', 'C');
        c = count;
        printf("%d\n", count);
        count = 0;
    }
    return 0;
}

나 : say

꼭꼬꼮ㄲㄲ고갸ㅐㅣ로ㅜ미ㅏㄴ암너ㅏㅣㅇㅁ너ㅣㅏㅇㅁㄴ
오타를 다시한번더 확인을 하자

댓글남기기