深度优先搜索 - 素数环
【题目描述】
从1到20,这20个数摆成一个环,要求相邻的两个数的和是一个素数。求所有可能。
【算法分析&&参考代码】
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int a[21],ans=0; //a数组表示第几个位置的数是啥。 5 bool b[21]={0}; //b数组表示标记,这个数用过没有? 6 bool pd(int,int); 7 void dfs(int); 8 void print(); 9 int main() 10 { 11 dfs(1); 12 cout<<ans<<endl; 13 return 0; 14 } 15 void dfs(int x) 16 { 17 for(int i=1;i<=20;i++) //每一个位置的开始,都有20种可能。 18 { 19 if(b[i]!=1&&pd(a[x-1],i)) 20 //b[i]!=1表示,第b[i]个数是否被用过。 21 //pd(a[x-1],i))表示,素数环上一个位置的数和新来的数的和是否为质数。 22 //若这俩互质,就不搞了,滚去下一层for循环。如果没有⬇️ 23 { 24 a[x]=i; //i在第x个空位. 25 b[i]=1; //标记位置,表示此处已经有一个数了, 26 //这个数出现过了。 27 if(x==20) //我们求的是1~20区间的数,组成的20个数的素数环,此处在判断是否到了尽头。 28 if(pd(a[x],a[1])) print(); 29 //如果头尾也互质,那就是个答案。果断输出。 30 dfs(x+1); //头尾不互质,那就再往下一个数搜。 31 b[i]=0; //回溯。这位置解决了,回去。 32 } 33 } 34 } 35 bool pd(int x,int y) 36 { 37 int m=x+y; 38 for(int j=2;j<=sqrt(m);j++) 39 if(m%j==0) return false; 40 return true; 41 } 42 void print() 43 { 44 ans++; 45 cout<<"<"<<ans<<">"; 46 for(int q=1;q<=20;q++) 47 cout<<a[q]<<" "; 48 cout<<endl; 49 }
作者:tyqEmptySet