dfs求解所有可能
#include <bits/stdc++.h>
using namespace std;
int n,pm[100],visit[20],ans[20],num;
/*
pm--素数数组,1为素数
visit[i]--纪录整数i是否访问过
ans[i]--表示第i个位置放哪个整数
*/
void dfs(int x){
if(x==n){
if(pm[ans[x]+ans[1]]){
for(int i=1;i<=n;i++)
printf("%d%c",ans[i],i==n?'\n':' ');
}
return;
}
for(int j=2;j<=n;j++){
if(!visit[j]){
if(pm[j+ans[x]]){
ans[x+1]=j;
visit[j]=1;
dfs(x+1);
visit[j]=0;
}
}
}
}
void getPrime(){
for(int i=1;i<100;i++)
pm[i]=1;
pm[1]=0;
for(int i=2;i<100;i++){
if(pm[i]){
for(int j=2*i;j<100;j+=i)
pm[j]=0;
}
}
}
int main(){
getPrime(); //素数筛方法打表
num=0;
while(~scanf("%d",&n)){
num++;
printf("Case %d:\n",num);
memset(visit,0,sizeof(visit));
memset(ans,0,sizeof(ans));
visit[1]=1;
ans[1]=1;
dfs(1);
printf("\n");
}
return 0;
}