GitHubSeob

C++ / 백준 / 11729 / 하노이 탑 이동 순서 본문

Baekjoon/Silver

C++ / 백준 / 11729 / 하노이 탑 이동 순서

GitHubSeob 2021. 9. 2.

문제

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

 

11729번: 하노이 탑 이동 순서

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

www.acmicpc.net

문제풀이

N=5일때 맨 아래 5번 원판을 세번째 장대로 옮겨야한다.

start를 시작 장대, end를 목표 장대, via를 start->end로 옮기기 위해 거치는 장대로 둔다.

5번 장대를 세번째 장대로 옮기기 위해서는 1~4번 원판을 2로 옮겨야 한다.

따라서 3번을 거쳐 2번으로 두기 때문에 hanoi(N, start, via, end)라는 함수가 있으면

hanoi(N-1, start, end, via)로 둔다.

4번 원판을 세번째 장대로 옮겨야한다.

4번 원판을 옮기기 위해서는 1~3 원판을 1로 옮겨야한다.

hanoi(N-1, via, start, end)로 둔다.

 

 

4번 원판을 세번째 장대로 옮긴다.

처음과 같은 형태가 됐다. 재귀 함수를 이용해서 반복을 한다.

N=1일때 시작장대에서 목표장대로 옮기므로 출력을 해준다.

 

 

코드

#include <iostream>
#include <cmath>
using namespace std;

void hanoi(int N, char start, char via, char end) {
	if (N == 1) cout << start << ' ' << end << '\n';
	else
	{
		hanoi(N - 1, start, end, via);
		cout << start << ' ' << end << '\n';
		hanoi(N - 1, via, start, end);
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int N = 0;
	cin >> N;
	cout << (int)pow(2, N) - 1 << '\n';
	hanoi(N, '1', '2', '3');
}

'Baekjoon > Silver' 카테고리의 다른 글

C++ / 백준 / 10610 / 30  (0) 2021.09.02
C++ / 백준 / 11047 / 동전 0  (0) 2021.09.02
C++ / 백준 / 2447 / 별 찍기 - 10  (0) 2021.09.01
C++ / 백준 / 18870 / 좌표 압축  (0) 2021.08.31
C++ / 백준 / 1992 / 쿼드트리  (0) 2021.08.25