1. 程式人生 > >《資訊學奧賽一本通》搜尋與回溯章節--素數環問題

《資訊學奧賽一本通》搜尋與回溯章節--素數環問題

題目:素數環:從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; }