백준 1914번 하노이 탑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <iostream> #include <queue> #include<stack> #include <cmath> #include<string> #include<vector> #include<algorithm> #include <cstring> //memset using namespace std; int ret; vector<pair <int, int> > v; void Hanoi(int n, int from, int by, int to) { if (n == 1) { v.push_back({ from,to }); } else { Hanoi(n - 1, from, to, by); v.push_back({ from,to }); Hanoi(n - 1, by, from, to); } } string bigNum(string n1, string n2) { long long sum = 0; string result; while (!n1.empty() || !n2.empty() || sum) { if (!n1.empty()) { sum += n1.back() - '0'; n1.pop_back(); } if (!n2.empty()) { sum += n2.back() - '0'; n2.pop_back(); } result.push_back((sum % 10) + '0'); sum /= 10; } reverse(result.begin(), result.end()); return result; } string subone(string num) { int back = num.back()-'0'; num.pop_back(); back -= 1; num.push_back(back + '0'); return num; } int main(void){ int n; cin >> n; if (n <= 20) { cout << (long long)pow(2, n) - 1 << "\n"; Hanoi(n, 1, 2, 3); for (int i = 0; i < v.size(); i++) { cout << v[i].first << " " << v[i].second << "\n"; } } else { string num = "2"; for (int i = 0; i < n - 1; i++) { string temp = bigNum(num, num); num = temp; } cout << subone(num) << "\n"; } return 0; } | cs |
문제 출처:https://www.acmicpc.net/problem/1914
코드 보고 똑같이 적어서 풀었습니다..
https://jaimemin.tistory.com/732
코드 참조
획기적인 알고리즘 사용이 아니라 큰 수 처리를 잘 해주는 것이 관건이였네요..
'알고리즘 > 알고리즘 문제 해결전략(종만북)' 카테고리의 다른 글
ALGOSPOT CHRISTMAS 알고스팟 크리스마스 인형 (3) | 2019.02.07 |
---|---|
ALGOSPOT STRJOIN 알고스팟 문자열 합치기 (0) | 2019.01.24 |
ALGOSPOT LUNCHBOX 알고스팟 도시락 데우기 (0) | 2019.01.23 |
ALGOSPOT MATCHORDER 알고스팟 출전 순서 정하기 (0) | 2019.01.23 |
ALGOSPOT PI 알고스팟 파이 (0) | 2019.01.23 |