https://www.acmicpc.net/problem/2661
백트래킹 문제이다.
재귀호출하며 조건을 충족하지 않는 경우에는 return해가며 가지치기 해야한다.
⚠️ 가장 작은 수를 출력해야하므로 flag을 사용해서 처음에 발견한 수열을 출력하고, 그 뒤로는 탐색하지 않아야한다.
#include <iostream>
#include <string>
using namespace std;
int N;
string ans;
bool found;
void dfs(string str, int depth) {
if (found) return;
//규칙검사
for (int i = 1; i <= str.length() / 2; i++) {
if (str.substr(str.length() - i, i) == str.substr(str.length() - 2 * i, i))
return;
}
if (depth == N) {
ans = str;
found = true;
return;
}
dfs(str + "1", depth + 1);
dfs(str + "2", depth + 1);
dfs(str + "3", depth + 1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N;
dfs("", 0);
cout << ans;
return 0;
}