简单DFS
#include <cstdio> bool used[21]; bool prim[41]; int now[21]; int i,j,n; void out() { printf("1"); for(int i=2;i<=n;i++) printf(" %d",now[i]); printf(" "); } void dfs(int step) { if (step==n&&prim[now[n]+1]) out();//注意是==,=导致WA for(int i=2;i<=n;i++) if ((!used[i])&&(prim[i+now[step]])) { used[i]=true; now[step+1]=i; dfs(step+1); used[i]=false; } } int main() { int cnt=1; for (int i=2;i<21;i++)used[i]=false; for (int i=1;i<41;i++)prim[i]=true; for(int i=2;i<41;i++) { if(!prim[i]) continue; for(int j=2*i; j<41; j+=i)prim[j]=false; } now[1]=1; used[1]=true; while(scanf("%d",&n)!=EOF) { printf("Case %d: ",cnt++); dfs(1); puts(""); } }