본문 바로가기

Algorithm/Divide And Conquer

(C++) - 백준(BOJ) 11729번 : 하노이 탑 이동 순서

반응형

https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

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

www.acmicpc.net

분할정복 문제였습니다.

 

풀이방법

 1. 1 -> 2로 n-1개 원판 옮김
 2. 1 -> 3로 남은 한 개(가장 큰 원판) 옮김
 3. 2 -> 3로 n-1개 원판 옮김

이 규칙을 적용하면 됩니다.

 

Code

#include <iostream>
using namespace std;
//n-1개를 2로 옮기고 
//마지막 남은 가장 큰 원판을 3으로 옮긴 뒤
//2에 있는 n-1개의 원판을 3으로 옮겨준다.
int n;
int ans;
int d[21][4];

void a_hanoi(int n, int from, int mid, int to)
{
    int tmp = 0;
    if (n == 1)
    {
        ans++;
    }
    else
    {
        a_hanoi(n - 1, from, to, mid);//n-1개를 두번째로 보낸다.
        ans++;
        a_hanoi(n - 1, mid, from, to);//n-1개를 세번째로 보낸다.
    }
}
void hanoi(int n,int from,int mid,int to) 
{
    int tmp = 0;
    if (n == 1)
    {
        cout << from << ' ' << to << '\n';
    }
    else
    {
        hanoi(n - 1, from, to, mid);//n-1개를 두번째로 보낸다.
        cout << from << ' ' << to << '\n';//마지막 남은 가장 큰 원판을 3으로 옮긴다.
        hanoi(n-1, mid, from, to);//n-1개를 세번째로 보낸다.
    }
}
int main() {
    cin >> n;
    a_hanoi(n, 1, 2, 3);
    cout << ans<<'\n';
    hanoi(n, 1, 2, 3);
}

 

 

'Algorithm > Divide And Conquer' 카테고리의 다른 글

(C++) - 백준(BOJ) 16206번 : 롤케이크  (0) 2021.08.14