回溯路徑的記錄
HDU 1016 http://acm.hdu.edu.cn/showproblem.php?pid=1016
題目大意:給定一個數N,從1到N的這些整數構成一個環,它的目的就是讓
你找出第相鄰兩個數都是素數的環。而且是所有的環。
View Code
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; int N; bool vis[21]; int pre[21]; bool prime[45]; bool Flag[45]; void GetPrime() { int i, j; for(i=2; i<=40; i++) { if(!Flag[i]) //沒有被標記就是素數 { prime[i] = true; for(j=i*i; j<=40; j=j+i) Flag[j] = true; //標記不是素數的數 } } } void DFS(int step){ int i; if(step==N){ if(prime[pre[step-1]+1]){ cout<<"1"; for(i=1; i<N; i++) cout<<" "<<pre[i]; cout<<endl; } return; }else{ for(i=2; i<=N; i++){ if(vis[i]==false && prime[pre[step-1]+i]){ vis[i] = true; pre[step] = i; //記錄路徑 DFS(step+1); vis[i] = false; //回溯就是這么一句話 } } } } int main() { int CaseN=1; GetPrime(); //打出素數表 while(cin>>N) { cout<<"Case "<<CaseN++<<":"<<endl; vis[1]=true; pre[0] = 1; DFS(1); cout<<endl; } }
posted on 2012-03-28 15:59 More study needed. 閱讀(225) 評論(0) 收藏 舉報

浙公網安備 33010602011771號