《資訊學奧賽一本通》搜尋與回溯章節--素數環問題
阿新 • • 發佈:2019-02-09
題目:素數環:從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;
}