题意是说对一个长度为 n 的数环进行排列,使得相邻两数的和为素数,按从小到大的顺序依次输出。
因为是环,所以总能调整成以 1 为序列首输出。用深度优先搜索的方法即可。在判断素数时由于 n 小于 20,所以两数的和小于 40,则只要手写小于 40 的素数数组即可。
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,a[25]; 4 bool vis[25]; 5 int prime[12] = {2,3,5,7,11,13,17,19,23,29,31,37}; 6 bool isprime(int m) 7 { 8 bool f = 0; 9 for(int i = 0; i < 12; i++) 10 if(m == prime[i]) 11 { 12 f = 1; 13 break; 14 } 15 return f; 16 } 17 void dfs(int step) 18 { 19 if(step == n+1 && isprime(a[n]+a[1])) 20 { 21 for(int i = 1; i < n; i++) 22 printf("%d ",a[i]); 23 printf("%d\n",a[n]); 24 return ; 25 } 26 for(int i = 2; i <= n; i++) 27 { 28 if(vis[i]) continue; 29 if(isprime(i+a[step-1])) 30 { 31 vis[i] = 1; 32 a[step] = i; 33 dfs(step+1); 34 vis[i] = 0; 35 } 36 } 37 } 38 int main() 39 { 40 int num(1); 41 a[1] = 1; 42 while(~scanf("%d",&n)) 43 { 44 printf("Case %d:\n",num++); 45 dfs(2); 46 printf("\n"); 47 } 48 return 0; 49 }