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数组记录数是否已经被取用,已取过的就不取。

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

原文地址:https://www.cnblogs.com/Jiiiin/p/8605185.html