http://acm.hdu.edu.cn/showproblem.php?pid=1016
#include<stdio.h> #include<stdlib.h> #include<string.h> int n; int flag[20]; int a[45],num[20]; void dfs(int x,int y) { int i; num[x]=y; flag[y]=1; if(x==n) { if(a[num[x]+num[1]]==0) { printf("1"); for(i=2;i<=n;i++) printf(" %d",num[i]); printf(" "); } return; } for(i=1;i<=n;i++) { if(!flag[i]&&!a[num[x]+i]) { dfs(x+1,i); flag[i]=0;//注意回溯 } } } int main() { int i,j,k; k=0; memset(a,0,sizeof(a)); a[1]=1;a[0]=1; for(i=2;i<=40;i++) { if(a[i]==0) { for(j=i+i;j<=40;j+=i) a[j]=1; } } while(scanf("%d",&n)!=-1) { k++; printf("Case %d: ",k); memset(flag,0,sizeof(flag)); dfs(1,1); printf(" "); } return 0; }