http://acm.hdu.edu.cn/showproblem.php?pid=1016
回溯法
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
bool isp[50],vis[50];
int n,a[50];
void IsPrime(int x){
bool flag = true;
for(int i=2; i<=sqrt(x); i++)
if(!(x % i)) {flag = false; break;}
if(flag) isp[x] = true;
return;
}
void DFS(int cur){
if(cur == n+1 && isp[a[n]+a[1]]){
printf("%d",a[1]);
for(int i=2; i<=n; i++)
printf(" %d",a[i]);
printf("\n");
}
else{
for(int i=2; i<=n; i++){
if(!vis[i] && isp[i+a[cur-1]]){
a[cur] = i;
vis[i] = 1;
DFS(cur+1);
vis[i] = 0;
}
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
for(int i=1; i<=40; i++) {isp[i] = false; vis[i] = false;}
for(int i=2; i<=40; i++) IsPrime(i);
int t = 0;
while(scanf("%d",&n) == 1){
printf("Case %d:\n",++t);
a[1] = 1;
DFS(2);
printf("\n");
}
return 0;
}