#include <bits/stdc++.h>
const int maxn = 10003;
using namespace std;
bool used[maxn];
int ans[maxn];
int n;
int No;
bool isPrime[maxn];
void prime() {//筛法预先处理处素数表
for(int i = 1; i <= maxn; i++) {
isPrime[i] = true;
}
isPrime[1] = false;
for(int i = 2; i <= maxn; ++i) {
if(isPrime[i]) {
for (int j = i * i; j <= maxn; j += i) {//从i*i开始就可以了
isPrime[j] = false;
}
}
}
}
void dfs(int step) {
if(step == n + 1 && isPrime[ans[n] + ans[1]] ) {
for(int i = 1; i <= n-1; ++i) {
printf("%d ", ans[i]);
}
printf("%d\n", ans[n]);
return;
}
for(int i = 2; i <= n; ++i) {
if(!used[i] && isPrime[i + ans[step - 1]]) {
used[i] = true;
ans[step] = i;
dfs(step+1);
used[i] = false;
}
}
}
int main() {
freopen("data.in", "r", stdin);
No = 1;
prime();
while(scanf("%d", &n) == 1) {
memset(ans, -1, sizeof(ans));
ans[1] = 1;//1开头
memset(used, false, sizeof(used));
printf("Case %d:\n", No);
dfs(2);
printf("\n");
++No;
}
return 0;
}
HDU 1016 Prime Ring Problem(DFS)
最新推荐文章于 2020-02-22 19:55:29 发布