素数环——搜索与回溯
题目描述 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 }
我不怕千万人阻挡,只怕自己投降…