• 深度优先搜索 codevs 1031 质数环


    codevs 1031 质数环

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
    题目描述 Description

    一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数。如下图是一个大小为6的质数环。为了方便描述,规定数环上的第一个数字总是1。如下图可用1 4 3 2 5 6来描述。若两个质数环,数字排列顺序相同则视为本质相同。现在要求你求出所有本质不同的数环。

    输入描述 Input Description


    只有一个数N,表示需求的质数环的大小。如:

    输出描述 Output Description

    每一行描述一个数环,如果有多组解,按照字典序从小到大输出。如:

    样例输入 Sample Input

    6

    样例输出 Sample Output

    1 4 3 2 5 6

    1 6 5 2 3 4

    数据范围及提示 Data Size & Hint
    n<=17
     1 /*数据极其水!!
     2 */
     3 #include<iostream>
     4 using namespace std;
     5 #include<cstdio>
     6 #include<cstring>
     7 #define N 20
     8 int ans[N],n;
     9 bool flag[N];
    10 bool is_prime(int i)
    11 {
    12        bool fla=true;
    13         for(int j=2;j*j<=i;++j)
    14           if(i%j==0)
    15           {
    16               fla=false;
    17               break;
    18           }
    19      return fla;
    20 }
    21 void dfs(int k)
    22 {
    23     if(k==n+1)
    24     {
    25         if(is_prime(ans[1]+ans[n]))
    26         {
    27             for(int i=1;i<=n;++i)
    28                   printf("%d ",ans[i]);
    29              printf("
    ");
    30         }
    31         return;
    32     }
    33     for(int i=2;i<=n;++i)
    34     {
    35         if(flag[i]) continue;
    36         if(!is_prime(i+ans[k-1])) continue;
    37         ans[k]=i;
    38         flag[i]=true;
    39         dfs(k+1);
    40         ans[k]=0;
    41         flag[i]=false;
    42     }
    43 }
    44 int main()
    45 {
    46     ans[1]=1;
    47     flag[1]=true;
    48     scanf("%d",&n);
    49     dfs(2);
    50     return 0;
    51  } 
  • 相关阅读:
    练习题
    练习
    2.15
    数组
    java聊天工具12.4
    11.13(2)
    11.13
    10.30 作业
    10.23
    面向对象
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5592235.html
Copyright © 2020-2023  润新知