http://acm.hdu.edu.cn/showproblem.php?pid=1016
#include <stdio.h>
#include "math.h"
#include "memory.h"
int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};//素数打表,因为n最大是20,所以只要打到40
int a[21]; //保存数据
int vit[21];
int n; //数据长度
void dfs(int wz)
{
if(n==wz&&prime[a[0]+a[wz-1]]) //头和尾相等,并且长度到了
{
int i;
for(i=0;i<wz;i++) //输出答案
{
printf("%d",a[i]);
if(i<wz-1)
{
printf(" ");
}
}
printf("\n");
}else
{
int i2;
for(i2=2;i2<=n;i2++)
{
if(prime[a[wz-1]+i2]&&!vit[i2]) //当前数字加上后面的数是素数
{
vit[i2]=1;
a[wz]=i2;
wz+=1;
dfs(wz);
vit[i2]=0; //递归还原
wz--;
}
}
}
}
int main(int argc, char *argv[])
{
int t=1;
while(scanf("%d",&n)!=EOF)
{
printf("Case %d:\n",t);
t+=1;
memset(vit,0,sizeof(vit));
a[0]=1;
dfs(1);
printf("\n");
}
return 0;
}