/* 将1-n个数放在环中,保证相邻的两个数的和是素数 第一个数字永远是1 就这两个约束条件 第一个难点是计算素数; 参考文献: http://c.biancheng.net/cpp/html/2547.html http://blog.csdn.net/liukehua123/article/details/5482854 第二个部分是深度递归; http://blog.csdn.net/a402630999/article/details/7208218 http://www.cnblogs.com/jiangjing/archive/2013/02/04/2891621.html */ #include <stdio.h> #include <stdlib.h> int n; int book[21],a[21]; int isPrime[42]; int get_prime() { for(int i=2;i<8;i++) { if(!isPrime[i]) { for(int j=i*i;j<42;j+=i) isPrime[j]=1; } } return 0; } int dfs(int x) { if(x==n&&!isPrime[a[0]+a[n-1]])//最后一个已经放进去,并且最后一对首尾也满足条件 { for(int i=0;i<x-1;i++) printf("%d ",a[i]); printf("%d ",a[x-1]); return 0; } for(int i=2;i<=n;i++) { if(book[i]==0&&!isPrime[a[x-1]+i])//没被使用,且上一个放进去的数和当前打算放进去的数的和是素数 { a[x]=i; book[i]=1; dfs(x+1); book[i]=0; } } return 0; } int main() { //freopen("input.txt","r",stdin); int num=0; while(scanf("%d",&n)!=EOF) { num++; a[0]=1; get_prime(); for(int i=0;i<21;i++) book[i]=0; printf("Case %d: ",num); dfs(1); printf(" "); } return 0; }