BOJ

백준 11729 - 하노이 탑 이동 순서

yanJuicy 2020. 3. 24. 23:04
반응형

문제

 

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

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다. 이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다. 아래 그림은 원판이 5

www.acmicpc.net

 

 

풀이

 

하노이 탑의 이동 순서를 구현하는 문제이다. 하노이 탑 알고리즘은 다음과 같다.

 

1. a b c 막대가 있고 a에 n개의 원판이 꽃혀져 있다면 n-1개의 원판을 b로 옮긴다.

2. a에 있는 1개의 막대를 c로 옮긴다.

3. b에 있는 n-1개의 막대를 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
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
 
using namespace std;
 
int K, cnt;
vector<pair<intint>> v;
 
void hanoi(int n, int from, int to, int by)
{
    cnt++;
    if (n == 1)
    {
        v.push_back({ from , to });
    }
    else
    {
        hanoi(n - 1, from, by, to);
        v.push_back({ from, to });
        hanoi(n - 1, by, to, from);
    }
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> K;
    hanoi(K, 132);
 
    cout << cnt << '\n';
    for (int i = 0; i < v.size(); i++)
        cout << v[i].first << ' ' << v[i].second << '\n';
 
    return 0;
}
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 14503 - 로봇 청소기  (0) 2020.04.03
백준 6549 - 히스토그램에서 가장 큰 직사각형  (0) 2020.03.27
백준 1107 - 리모컨  (0) 2020.03.24
백준 1780 - 종이의 개수  (0) 2020.03.23
백준 1080 - 행렬  (0) 2020.03.22