可以尝试一下,转到超级多哈哈哈
题目?
素数环定义:
从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
【算法分析】
非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。
【算法流程】
1、数据初始化; 2、递归填数:判断第i个数填入是否合法;
A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;
B、如果不合法:选择下一种可能;
【代码】
#include<iostream> #include<cmath> using namespace std; bool b[21]= {0}; int h=0,a[21]= {0}; bool pd(int x,int y) { //判断和是否为素数; int k=2,i=x+y; while(k<=sqrt(i) && i%k!=0) k++; if(k>sqrt(i)) return 1;//为素数; else return 0; //不是素数; } int print() { //输出; h++;//h为个数; cout<<"<"<<h<<">"; for(int j=1; j<=20; j++) cout<<a[j]<<" "; cout<<endl; } int search(int t) { for(int i=1; i<=20; i++) //判断与前一个数是否构成素数及该数是否可用; if(pd(a[t-1],i) && (!b[i])) { //!b[i]是说b[i]没有被使用过~ a[t]=i; b[i]=1; //将使用过的赋值为1; if(t==20) { if(pd(a[20],a[1])) print(); } else search(t+1); b[i]=0; //回溯; } } int main() { search(1); cout<<h<<endl; return 0; }