素数环问题(回溯算法)

mac2024-10-11  53

问题:素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。

解析:从1开始,每个空位有20种可能,只要填进去的数合法:

与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。 #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> using namespace std; bool b[21]={0}; //判断i是否出现在素数环中 int total=0,a[21]={0}; //a记录素数环中的每一个数 int search(int t); //回溯过程。形参表示素数环中的数的编号 int print(); //输出方案 bool pd(int,int); //判断素数 int search(int t){ //寻找所有解 int i; for (i=1;i<=20;i++) //有20个数可选 if (pd(a[t-1],i)&&(!b[i])){ //判断与前一个数是否构成素数及该数是否可用 a[t]=i; //素数环中的第t个数 b[i]=1; //i进入素数环 if (t==20) { //一个解 if (pd(a[20],a[1])) print();} else search(t+1); b[i]=0; } } int main(){ search(1); cout<<total<<endl; //输出总方案数 } int print(){ total++; cout<<"<"<<total<<">"; for (int j=1;j<=20;j++) cout<<a[j]<<" "; cout<<endl; } 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; }
最新回复(0)