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("\n");
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值