经典回溯题
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
#define DEBUG
const int maxn=1000+5,maxv=26,INF=0x3f3f3f3f,mod=100000000;
bool isp[maxn],visited[maxn];
int A[maxn];
bool is_prime(int n){
for(int i=2;i<=n/2;i++){
if(n%i==0)return 0;
}
return 1;
}
void dfs(int cur,int n,int* A){
if(cur==n&&isp[A[n-1]+A[0]]){
for(int i=0;i<n;i++){
printf("%d",A[i]);
if(i!=n-1)printf(" ");
}
printf("\n");
return;
}
for(int i=2;i<=n;i++){
if(visited[i])continue;
if(!isp[i+A[cur-1]])continue;
A[cur]=i;
visited[i]=1;
dfs(cur+1,n,A);
visited[i]=0;
}
}
int main(){
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int n;
int kase=0;
while(cin>>n){
if(kase)printf("\n");
kase++;
memset(visited,0,sizeof(visited));
visited[1]=1;
A[0]=1;
for(int i=2;i<=2*n;i++)if(is_prime(i))isp[i]=1;
printf("Case %d:\n", kase);
dfs(1,n,A);
}
#ifdef DEBUG
fclose(stdin);
fclose(stdout);
#endif
return 0;
}