您的位置:首页 > 其它

回溯路径的记录

2012-03-28 15:59 316 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: