• Prime Ring Problem (DFS练习题)


               K - Prime Ring Problem

     
    =================================================================================================================================
    题目大意是给出 1~n 个数 第一个数必定是 1 ,使得无论那两个相邻的数相加,都是质数(即大于1的自然数中,除了1和它本身以外不再有其他因数);
    打印出所有可能,即直接用dfs 遍历所有可能性;
    我的代码思路:
    1. 数组范围很小 最大的和不超过40  则可以直接预处理这个范围内的数是否为质数。
    2.如何快速判断是否为质数 ,快速的方法 :先判断2之后  3~sqrt(n) 之间所有的奇数 是否存在其约数。
    3.用tail数组储存列表。
    4.一般dfs的套路 使用book 标记是否使用过,开始遍历。
    =================================================================================================================================
    代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 using namespace std;
     6 int n;
     7 bool prime[40]; 
     8 void Prime()  //预处理1~40之间的数是否为质数
     9 {
    10     for(int i = 3;i <= 40;++i)
    11     {
    12         bool flag = 0;
    13         for(int j = 2;j<=sqrt(i);j==2?++j:j+=2)
    14           if(i%j==0) {flag = 1;break;}
    15         flag==0?prime[i]=1:prime[i]=0; //1即为质数0则否
    16     }
    17 }
    18 int tail[40]; //列表
    19 void print()  //打印列表
    20 {
    21     for(int i =1;i<=n;++i)
    22         printf(i==n?"%d
    ":"%d ",tail[i]);
    23 }
    24 bool book[40]; //标记
    25 void dfs(int x)
    26 {
    27     if(x==n)
    28        {   //最后再判断最后一个数与第一个数相加是否为质数
    29            if(prime[tail[n]+tail[1]]) print(); 
    30            return; 
    31        }
    32     for(int i = 2;i<=n;++i)
    33     {
    34         if(prime[i+tail[x]]&&book[i]==0)//标准dfs套路↓
    35         {
    36             tail[x+1] = i;
    37             book[i] = 1;
    38             dfs(x+1);     
    39             book[i] = 0;
    40         }
    41     }
    42 }
    43 int main()
    44 {
    45     int cas = 0;
    46     Prime();
    47     tail[1] = 1; book[1] = 1;
    48     while(~scanf("%d",&n))
    49     {
    50         memset(book,0,sizeof(book));
    51         printf("Case %d:
    ",++cas);
    52         if(n==1) printf("1
    ");
    53         else if(n%2==1) ; //如果是奇数,铁定实现不了
    54         else dfs(1);
    55         putchar('
    ');
    56     }
    57 }
  • 相关阅读:
    JavaScript 以POST方式打开新页面
    C# 实现守护进程
    SQL Server 之 使用RowCount遍历表数据
    SQL Server 之 存储过程调用C#编写的dll文件
    C# 多线程学习整理
    java 学习的有用链接
    git 操作命令
    关于各种Map的那些事
    JAVA 反射机制详解
    深入理解java:注解(Anotation)自定义注解
  • 原文地址:https://www.cnblogs.com/darkboy/p/9402297.html
Copyright © 2020-2023  润新知