컴퓨터공부/Problem Solving

BaekJoon(11729)::하노이의 탑 이동 순서

문제

 

11729번: 하노이 탑 이동 순서

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

www.acmicpc.net

문제파악

  • 하노이 탑의 이동 원리 파악 → 출력
  • 하노이 탑의 이동 횟수 → 재귀식을 일반항으로 도출하여 주워진 판의 갯수를 통해 총 이동횟수를 알 수 있다.

문제풀이

  1. 하노이 탑의 이동횟수 → $a_n = 2^n-1$
  2. 각 하노이의 마지막 판의 이동을 출력
#include <iostream>
#include <cmath>
using namespace std;

void hanoi(int n, int from, int via, int to) {
    if (n == 1) {
        printf("%d %d\n", from, to);
        return;
    }

    hanoi(n - 1, from, to, via);
    printf("%d %d\n", from, to);
    hanoi(n - 1, via, from, to);
    return;
}

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

    printf("%d\n", (int)pow(2, n) - 1);

    hanoi(n, 1, 2, 3);
    return 0;
}

주의할 점

  1. 출력 시간 단축 → cout, endl를 이용하여 출력시 시간초과 발생, printf 추천
  2. pow의 return 타입이 float로 틀린 결과가 나옴. 즉, 형변환을 해줘야한다.
728x90

'컴퓨터공부 > Problem Solving' 카테고리의 다른 글

BaekJoon(10989)::수 정렬하기 3  (0) 2021.04.23
BaekJoon(2798)::블랙잭  (0) 2021.04.19
BaekJoon(10872)::팩토리얼  (0) 2021.04.11
BaekJoon(1002)::터렛  (0) 2021.04.10
BaekJoon(3053)::택시 기하학  (0) 2021.04.07