回溯路径的记录
HDU 1016 http://acm.hdu.edu.cn/showproblem.php?pid=1016
题目大意:给定一个数N,从1到N的这些整数构成一个环,它的目的就是让
你找出第相邻两个数都是素数的环。而且是所有的环。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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. 阅读(216) 评论(0) 编辑 收藏 举报