题目:素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数
简单的搜索与回溯
#include <iostream>
#include <cmath>
using namespace std;
bool ha[21];
int total;
short int a[21];
bool pd(short int a,short int b){
if(a+b==3)return 1;
for(int i=2;i<=sqrt(a+b);++i){
if((a+b)%i==0)return 0;//如果有1以外的因数,则不是素数
return 1; //没有的话,是素数
}
}
void print(){
for(int i=1;i<=20;++i){
cout<<a[i]<<" ";
}
cout<<"\n";
//getchar();
}
void search(short int cs){
for(int i=1;i<=20;++i){
if(ha[i])continue;
a[cs]=i; //赋值,将该位置a赋值为i
ha[i]=1; //去重
if(cs==20){ //边界条件,如果到了第20层
if(pd(a[20],a[19])&&pd(a[20],a[1])){ //
print();
total++;
}
}
else if(cs>1){
if(pd(a[cs-1],a[cs])){ //如果上一个数与这一个的和为素数
search(cs+1); //搜索下一层
}
}
else if(cs==1){
search(cs+1);
}
ha[i]=0; //回溯
}
return;
}
int main(){
search(1);//参数为层数
return 0;
}