BEAKJOON

백준(11729번 하노이 탑 이동 순서)풀이 C++

Shin_jisoo 2021. 1. 15. 21:08
728x90

www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

1) 주석 없는 VERSION

#include <iostream>
#include <cmath>
#include <stdio.h>

using namespace std;

void hanoi(int n, int start, int bypass, int end)
{
    if (n == 1) {
        cout << start << " " << end << '\n';
    }
    else {
        hanoi(n - 1, start, end, bypass);
        cout << start << " " << end << '\n';
        hanoi(n - 1, bypass, start, end);

    }
}
int main() {
    int n;
    cin >> n;

    cout << (1 << n) - 1 << '\n';
    hanoi(n, 1, 2, 3);
    return 0;
}

 

2) 주석 있는 VERSION

 

CASE 1) 원반이 1개인 경우 -> 1번(start)에서 3번(end)으로 바로 이동

 

CASE 2) 원반이 여러 개인 경우

(1) n-1 개의 원판을 3번을 거쳐 2번으로 옮김

(2) 1번의 가장 큰 크기의 원판을 3번으로 옮김

(3) 2번의 n-1개 원판을 1번을 거쳐 3번으로 옮김

 

최솟값 : (2^n)-1 개

 

#include <iostream>
#include <cmath>
#include <stdio.h>

using namespace std;

void hanoi(int n, int start, int bypass, int end)
{
    //원반이 한개인 경우
    if (n == 1) {
        cout << start << " " << end << '\n';
    }
    else {

        // n-1 개의 원판을 3번(end)를 거쳐 2번(bypass)로 옮김
        hanoi(n - 1, start, end, bypass);

        //1번(start)의 가장 큰 크기의 원판을 3번(end)으로 옮김
        cout << start << " " << end << '\n';

        //2번(bypass)의 n-1개 원판을 1번(start)을 거쳐 3번(end)로 옮김
        hanoi(n - 1, bypass, start, end);

    }
}
int main() {
    int n;
    cin >> n;

    //최솟값은 (2^n)-1 개
    cout << (1 << n) - 1 << '\n';

    //start,bypass,end 호출
    hanoi(n, 1, 2, 3);
    return 0;
}