고리 안에 있는 인접한 두 개의 숫자의 합이 소수인 고리를 찾는 것이 문제입니다. 고리의 시작은 1로 고정돼있습니다.
입력의 범위가 \(0<n\leq16\) 인 점을 생각하시면, 합이 31 이하 소수들이 될 것이라는 점을 예상할 수 있습니다.
31 이하 소수는 \([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]\) 이렇게 11개가 있습니다.
dfs로 풀면 됩니다.
출력 형식에 유의하세요.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
int n;
bool primes[32];
bool visited[17];
vector<vector<int>> answer;
void dfs(vector<int>& circle, int current) {
if (current == n) {
for (auto it = circle.begin(); it != circle.end(); ++it) {
cout << *it;
if (it + 1 != circle.end()) cout << ' ';
}
cout << '\n';
return;
}
int sum;
for (int candidate = 2; candidate <= n; ++candidate) {
sum = circle[current-1] + candidate;
if (!visited[candidate] && primes[sum]) {
//끝부분인 경우
if (current == n-1 && !primes[circle[0] + candidate]) {
continue;
}
circle[current] = candidate;
visited[candidate] = true;
dfs(circle, current + 1);
visited[candidate] = false;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL);
primes[2] = primes[3] = primes[5]
= primes[7] = primes[11] = primes[13]
= primes[17] = primes[19] = primes[23]
= primes[29] = primes[31] = true;
int cnt = 0;
while (cin >> n) {
if (cnt != 0) cout << "\n";
cout << "Case " << ++cnt << ":\n";
answer.clear();
vector<int> circle;
circle.resize(n);
circle[0] = 1;
visited[0] = true;
dfs(circle, 1);
}
return 0;
}
반응형
'Online Judge > UVa' 카테고리의 다른 글
[UVa][C++] 301: Transportation (수송) (0) | 2020.04.03 |
---|