素数环——搜索与回溯

题目描述 Description
从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
 输入输出格式 Input/output
输入格式:
无输入
输出格式:
一个整数(第几号素数环),一列数字(表示这个素数环)
 输入输出样例 Sample input/output
样例测试点#1
输入样例:
输出样例:
这里就不演示了(…)
思路:循环20次,首先判断两个数的和是否为质数,是,直接赋值,否,下一个继续。
到末尾再判断首尾是否能相接,能的话,输出!
代码如下(本代码来自“《算法竞赛入门经典》 第5章 搜索与回溯算法C++版 标准代码”)
 1 #include <stdio.h>
 2 #include <math.h>
 3 int a[30]={0};
 4 int b[30]={0};
 5 int zongshu=0;
 6 int k; 
 7 int zhishu(int x,int y)//判断质数函数 
 8 {
 9     int k=2,i=x+y;
10     while(k<=sqrt(i)&&i%k!=0) k++;
11     if(k>sqrt(i)) return 1;
12        else return 0;
13 }         
14 int shuchu()//输出函数 
15 {
16     int i;
17     printf("No.%d  ",zongshu++);
18     for(i=0;i<20;i++)
19     {
20         printf("%d ",a[i]);
21     }
22     printf("\n");
23 }
24 int kk(int p)
25 {
26     int i;
27     for(i=1;i<=20;i++)
28     {
29         if((zhishu(a[p-1],i)&&(!b[i]))==1)//符合条件            
30         {
31              a[p]=i;
32              b[i]=1;
33              if(p==20) 
34                { 
35                     if(zhishu(a[20],a[1]))//判断首尾是否能相接,为真,输出 
36                  {
37                      shuchu();//是的话,输出即可 
38                   }                                
39               }
40              else kk(p+1);//否则,下一个。。。 
41              b[i]=0;//还原场景 
42         }
43     }   
44 }         
45 int main()
46 {
47     kk(1);
48     printf("%d\n",zongshu);
49     return 0;
50 }

 

posted @ 2015-05-03 16:41  Memoryヾノ战心  阅读(305)  评论(0编辑  收藏  举报