본문 바로가기

알고리즘/백준

백준 11729 하노이 탑 이동순서 - 분할정복 -C++

728x90

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

 

11729번: 하노이 탑 이동 순서

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

www.acmicpc.net

사실 문제를 보고 꽤 고민을 해봤는데, 어떻게 푸는 문제인지 전혀 감이 잡히지 않았다.

아직 PS에 대한 감이 많이 부족한것 같다.

 

함수를 recursive하게 정의하는 부분에서 사고가 좀 막힌것 같다.

탑이 있는곳, 탑이 옮겨질 곳, 안쓰는 곳 세개로 함수를 구현한 다음에

옮길 함수의 탑 층수가 1일때만 옮기고, 1 이상일때는 층수를 하나 줄여서 재귀 구조로 짜면 된다.

 

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
#include <iostream>
using namespace std;
int answernum;
 
int Ans(int num){
    int answer=0;
    int i=1;
    while(i<=num){
        answer = 2*answer+1;
        i++;
    }
    return answer;
}
 
void hanoi(int num, int from, int to, int not_use){
    if(num==1)
        cout<<from<<" "<<to<<"\n";
    else{
        hanoi(num-1,from,not_use,to);
        hanoi(1,from,to,not_use);
        hanoi(num-1,not_use,to,from);
    }
}
 
int main(void){
    int num;
    cin>>num;
    cout<<Ans(num)<<"\n";
    hanoi(num,1,3,2);
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

아직 함수를 어떤 식으로 구현해야 하는지에 대한 감이 부족한것 같다. 연습만이 살길.