끄적끄적 코딩
article thumbnail

하노이 탑 문제입니다.

첫번째줄에 이동횟수를
두번째 줄 부터는 이동 과정을 출력합니다.

탑의 크기가 100보다 작거나 같으므로, long long보다 큰 수가 나오게 됩니다.
그래서 string으로 문자를 받아서 한자리씩 더하게 하였습니다.
2^n - 1을 하면 이동횟수를 구할수있습니다.

하노이탑은 재귀함수를 통해서 구현하였습니다.

 

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

string add(string num1, string num2)
{
	long long sum = 0;
	string result;

	while (!num1.empty() || !num2.empty() || sum) {
		if (!num1.empty()) {
			sum += num1.back() - '0';
			num1.pop_back();
		}
		if (!num2.empty()) {
			sum += num2.back() - '0';
			num2.pop_back();
		}
		result.push_back((sum % 10) + '0');
		sum /= 10;
	}
	reverse(result.begin(), result.end());

	return result;
}

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

int main(int argc, char* argv[])
{
	int n;
	int sub;
	string num;
	string result;

	scanf("%d", &n);

	if (n == 1) {
		result = '1';
	}
	else {
		num = "2";
		for (int i = 0; i < n - 1; ++i) {
			result = add(num, num);
			num = result;
		}
		sub = result.back() - '0';
		result.pop_back();
		sub -= 1;
		result.push_back(sub + '0');
	}

	cout << result << endl;

	if (n <= 20) {
		hanoi(n, 1, 2, 3);
	}

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 15913번 가위 바위 보 999  (0) 2019.09.18
[C++] 백준 10810번 공 넣기  (0) 2019.09.18
[C++] 백준 4101번 크냐?  (0) 2019.09.18
[C++] 백준 5337번 웰컴  (0) 2019.09.18
[C++] 백준 2903번 중앙 이동 알고리즘  (0) 2019.09.18

검색 태그