HDU 1016(素数环 深搜)

题意是说对一个长度为 n 的数环进行排列,使得相邻两数的和为素数,按从小到大的顺序依次输出。

因为是环,所以总能调整成以 1 为序列首输出。用深度优先搜索的方法即可。在判断素数时由于 n 小于 20,所以两数的和小于 40,则只要手写小于 40 的素数数组即可。

代码如下:

 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 }
View Code

 

转载于:https://www.cnblogs.com/Taskr212/p/9526295.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值