1. 程式人生 > >杭電1016 Prime Ring Problem

杭電1016 Prime Ring Problem

該題目的大概意思是:給定一個正整數n,在1~n這n個數中,按一定順序組成一個圓環,要求圓環相鄰兩個數之和為素數,求出所有這樣的組合並輸出。思路:開始想到迴圈列舉判斷,現在用DFS法//Prime Ring Problem   #include <iostream>  #include<cmath>  using namespace std;  int prime[40]={ 0,1,1,1,0,1, 0,1,0,0,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,1,0,0};//手打素數表  int n; bool visit[25];//是否進行遍歷的標誌陣列 int a[25]; //儲存數字1~n void dfs(int num) { if(num==n && prime[a[0]+a[num-1]])//遍歷所有數且相鄰數之和為素數,則符合,輸出 { for(int i=0;i<num;i++) { if(i!=num-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } } else { for(int i=2;i<=n;i++) { if(visit[i]==0)//若有未遍歷的 { if(prime[i+a[num-1]])//若與已遍歷的最後一個數之和為素數,符合要求 { visit[i]=1; a[num++]=i;//賦值 dfs(num);//遍歷該分支 visit[i]=0;//恢復,等待下次迴圈遍歷另一分支 num--; } } } } } int main() { int count=0; while(cin>>n) { count++; cout<<"Case "<<count<<":"<<endl; a[0]=1; dfs(1);//從根遍歷 cout<<endl; } return 0; } 另外題中因為資料不多,素數表可手打,判斷時也方便,也可用下面的函式代替:2bool IsPrime(int n)  3{  4for (int i =2; i * i <= n; i++)  5if(n % i ==0)  6returnfalse ;  7returntrue ;  8} 另附大神部落格學習:http://blog.csdn.net/lishuhuakai/article/details/8014971