# 생각

원판 n개를 a에서 b로 이동하는 함수를 만든다

void func(int a, int b, int n)

 

base condition은 n이 1일 때 a에서 b로 옮기는 것이다

if (n == 1)
	{
		cout << a << ' ' << b << '\n';
		return;
	}

 

나머지 재귀식은 아래처럼 작성할 수 있다

기둥이 1번, 2번, 3번 3개 이기때문에 기둥을 (1+2+3) - a - b로 표현 가능하다

	func(a, 6 - a - b, n - 1);		// n-1개의 원판을 기둥 a에서 기둥 6-a-b로 옮긴다
	cout << a << ' ' << b << '\n';		// n번 원판을 기둥 a에서 기둥 b로 옮긴다
	func(6 - a - b, b, n - 1);		// n-1 개의 원판을 기둥 6-a-b에서 기둥 b로 옮긴다

 

 

# 전체 코드

(base condition을 0으로 줄 경우 더 간단하게 return으로 탈출만 해줘도 동일하게 동작한다)

#include <bits/stdc++.h>
using namespace std;

void func1(int a, int b, int n)
{
	if (n == 1)	// base condition
	{
		cout << a << ' ' << b << '\n';
		return;
	}
	func1(a, 6 - a - b, n - 1);		// n-1개의 원판을 기둥 a에서 기둥 6-a-b로 옮긴다.
	cout << a << ' ' << b << '\n';		// n번 원판을 기둥 a에서 기둥 b로 옮긴다.
	func1(6 - a - b, b, n - 1);		// n-1 개의 원판을 기둥 6-a-b에서 기둥 b로 옮긴다.
}

void func2(int a, int b, int n)
{
	if (n == 0)	// base condition
	{
		return;
	}
	func2(a, 6 - a - b, n - 1);		// n-1개의 원판을 기둥 a에서 기둥 6-a-b로 옮긴다.
	cout << a << ' ' << b << '\n';		// n번 원판을 기둥 a에서 기둥 b로 옮긴다.
	func2(6 - a - b, b, n - 1);		// n-1 개의 원판을 기둥 6-a-b에서 기둥 b로 옮긴다.
}

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

	int k;
	cin >> k;
	//cout << (int)pow(2, k) - 1 << '\n';	// pow함수 사용시 double을 int로 형변환 해줘야 한다
	cout << (1 << k) - 1 << '\n';		// 1을 k칸 left shift = 2^k
	//func1(1, 3, k);
	func2(1, 3, k);
}

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

 

11729번: 하노이 탑 이동 순서

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

www.acmicpc.net

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 17478_재귀함수가 뭔가요? with cpp  (0) 2022.01.27
[BOJ] 1074_Z with cpp  (0) 2022.01.27
[BOJ] 1629_곱셈 with cpp  (0) 2022.01.25
[BOJ] 5427_불 with cpp  (0) 2022.01.25
[BOJ] 6593_상범 빌딩 with cpp  (0) 2022.01.23

+ Recent posts