http://acm.hdu.edu.cn/showproblem.php?pid=1016
题意不多说 每次从1开始
代码如下:
#include <stdio.h>
#include <string.h>
int prim[50];
int n;
int vis[50];
int count[50];
void dfs(int t){
if (t==n){
if(!prim[count[n-1]+count[0]]){
for (int i=0;i<n-1;i++){
printf ("%d ",count[i]);
}
printf ("%d\n",count[n-1]);
}
return ;
}
for (int i=2;i<=n;i++){
if (!prim[i+count[t-1]]&&!vis[i]){
count[t]=i;// 存下符合要求的数
vis[i]=1;
dfs(t+1);
vis[i]=0;
}
}
}
int main (){
int count1=1;
while (scanf ("%d",&n)!=EOF){
memset(prim,0,sizeof(prim));
for (int i=2;i<50;i++){// 素数打表
if (!prim[i]){
for (int j=i+i;j<50;j+=i)
prim[j]=1;
}
}
memset(vis,0,sizeof(vis));
printf ("Case %d:\n",count1);
count[0]=1;
vis[1]=1;// 记录数字i是否被访问过
dfs(1);
putchar('\n');
count1++;
}
return 0;
}