zoukankan      html  css  js  c++  java
  • EOJ 1114 素数环

     题意

    一个由自然数 1…n (n≤18) 素数环就是如下图所示,环上任意两个节点上数值之和为素数。

       1
      /
       4  2
       /
         3

    Input

    输入只有一个数 n,表示你需要建立一个 1…n 的素数环。
    Output

    按照字典序输出每一种情况。我们约定顺时针为正向,且第一个元素必须是 1。


     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int state[19],out[19]={0,1};
     4 int primelist[12]={2,3,5,7,11,13,17,19,23,29,31,37};
     5 int num;
     6 int isprime(int n)
     7 {
     8     for(int i=0;i<12;i++)
     9         if(primelist[i]==n) return 1;
    10     return 0;
    11 }
    12 void bt(int n)
    13 {
    14     static int j=1,k;
    15     int i;
    16     if(n==1)
    17         if(isprime(out[1]+out[num]))
    18         {
    19             for(k=1;k<=num;k++)
    20                 printf("%d ",out[k]);
    21             printf("
    ");
    22         }
    23 
    24     for(i=(out[j]+1)%2+2;i<=num;i+=2)
    25     {
    26         if(state[i]==1) continue;
    27         if(isprime(out[j]+i))
    28         {
    29             out[++j]=i;
    30             state[i]=1;
    31             bt(n-1);
    32             j--;
    33             state[i]=0;//back
    34         }
    35     }
    36 
    37 }
    38 int main()
    39 {
    40     scanf("%d",&num);
    41     int n=num;
    42     if(n%2==0)   bt(n);
    43     return 0;
    44 }

    state数组记录数是否已经被取用,已取过的就不取。

    回溯,注意递归的结束条件,以及递归返回的时候能够返回之前的状态

  • 相关阅读:
    [HAOI2006] 数字序列
    [HAOI2012] 外星人
    [HAOI2012] 高速公路
    [HAOI2007] 覆盖问题
    [HAOI2007] 分割矩阵
    [HAOI2007] 上升序列
    牛客练习赛58 D 迷宫
    牛客练习赛58 F XOR TREE
    牛客练习赛58 E 最大GCD
    牛客练习赛58 C 矩阵消除游戏
  • 原文地址:https://www.cnblogs.com/Jiiiin/p/8605185.html
Copyright © 2011-2022 走看看