문제
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
문제파악
- 하노이 탑의 이동 원리 파악 → 출력
- 하노이 탑의 이동 횟수 → 재귀식을 일반항으로 도출하여 주워진 판의 갯수를 통해 총 이동횟수를 알 수 있다.
문제풀이
- 하노이 탑의 이동횟수 → $a_n = 2^n-1$
- 각 하노이의 마지막 판의 이동을 출력
#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;
}
주의할 점
- 출력 시간 단축 → cout, endl를 이용하여 출력시 시간초과 발생, printf 추천
- 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 |