很直白的枚举排列问题。。用回溯法减少枚举量。。water。。用vis数组来加速判断。。
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define LL long long
#define maxn 105
#define maxm 10005
#define mod 1000000007
#define INF 1000000007
#define eps 1e-5
#define PI 3.1415926535898
#define N 52
using namespace std;
//-------------------------CHC------------------------------//
bool is_prime[32];
int n, kase = 1;
int a[maxn];
bool vis[maxn];
void pre() {
is_prime[2] = true;
for (int i = 3; i <= 31; ++i) {
bool ok = true;
for (int j = 2; j < sqrt(i) + 1; ++j) {
if (i % j == 0) ok = false;
}
if (ok) is_prime[i] = true;
}
}
void dfs(int cur) {
if (cur == n + 1 && is_prime[1 + a[n]]) {
printf("%d", a[1]);
for (int i = 2; i <= n; ++i) printf(" %d", a[i]);
puts("");
return;
}
for (int i = 2; i <= n; ++i) {
if (!vis[i] && is_prime[i + a[cur - 1]]) {
a[cur] = i;
vis[i] = 1;
dfs(cur + 1);
vis[i] = 0;
}
}
}
int main() {
pre();
while (~scanf("%d", &n)) {
CLEAR(vis, 0);
a[1] = 1;
if(kase > 1) putchar('\n');
printf("Case %d:\n", kase++);
dfs(2);
}
return 0;
}