• HDU 1016 素数环问题


    题目大意:

    给定1-n这n个数,组成以1开头的素数环,保证相邻两个数相加均为素数

    题目用dfs搜索再回溯,这样碰到不成立的立刻退出递归,就减少了很多步骤,不然暴力来就是n!次复杂度,肯定是超时的

    每次添入数据都要判断是否相邻数相加为素数,所以我们可以提前打个素数表,这样使自己判断素数更加方便

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 using namespace std;
     5 
     6 #define N 22
     7 int n , a[N] , visit[N] , prime[41];
     8 
     9 void prime_table()
    10 {
    11     memset(prime,0,sizeof(prime));
    12     for(int i = 2;i<40;i++){
    13         if(!prime[i]){
    14             for(int j=i+i;j<40;j+=i)
    15                 prime[j] = 1;
    16         }
    17     }
    18 }
    19 
    20 void dfs(int x,int cnt)
    21 {
    22     visit[x] = 1;
    23     if(cnt == n && !prime[a[0]+a[cnt-1]]){
    24         printf("%d",a[0]);
    25         for(int i=1;i<cnt;i++)
    26             printf(" %d",a[i]);
    27         printf("
    ");
    28     }
    29 
    30     for(int i=1;i<=n;i++){
    31         if(!visit[i]&& !prime[a[cnt-1]+i]){
    32             a[cnt] = i;
    33             dfs(i,cnt+1);
    34             visit[i]=0;//回溯
    35         }
    36     }
    37 }
    38 
    39 int main()
    40 {
    41     int t = 1;
    42     prime_table();
    43     while(~scanf("%d",&n))
    44     {
    45         printf("Case %d:
    ",t);
    46 
    47         memset(visit,0,sizeof(visit));
    48         a[0] = 1;
    49         dfs(1,1);
    50         //这里一组数据做完记得换行,题目要求
    51         printf("
    ");
    52         t++;
    53     }
    54 }
  • 相关阅读:
    [AGC020E] Encoding Subsets
    [Topcoder16346]TwoPerLine
    CF913E Logical Expression
    英语面试
    CRM
    WEB使用第三方支付服务大致流程
    OO语言 prototype 初级用法
    flash设置字体
    air 提示问题
    c#里的BYTE
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3993429.html
Copyright © 2020-2023  润新知