그 유명한 하노이의 탑 문제이다. 벡터에 결과를 담아서 리턴해주면 되는 문제이다. 재귀적 접근에 대한 이해가 있다면 풀 수 있는 문제이다.
간단하게 설명하면 n 개짜리 하노이탑은 n-1개를 현재점과 목표지점이 아닌 지점(6 - go - to)에 두고 n번 원판(쌓인것중 가장큰)을 목표지점에 둔다음 n-1개의 원판들을 다시 목표지점으로 보내는 재귀적인 방법을 사용하면 된다.
#include <string>
#include <vector>
using namespace std;
void hanoi(int n, int go, int to, vector<vector<int>>& answer) {
if (n == 1) {// 쌓인 원판이 한개라면
answer.push_back({go, to});
return ;
}
hanoi(n-1, go, 6-go-to, answer);// n-1 개의 원판을 시작점, 목표점을 제외한 곳으로 이동
hanoi(1, go, to, answer);// n번째 원판을 목표지점으로 이동
hanoi(n-1, 6-go-to, to, answer);// n-1 개의 원판을 목표점으로 이동
}
vector<vector<int>> solution(int n) {
vector<vector<int>> answer;
hanoi(n, 1, 3, answer);
return answer;
}