题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
题目大意:
求n个数字排成环,环上相邻的数字相加为素数,按字典序输出
白书上的原题吧。
#include <iostream>
#include<memory.h>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=45;
int prime[maxn];
int vis[21];
int path[21];
int n;
void init()
{
memset(prime,-1,sizeof(prime));
memset(vis,0,sizeof(vis));
}
void makePrimeTable(){
int m=40;
int mm=sqrt(m+0.5);
prime[0]=prime[1]=0;
for(int i=2;i<=mm;++i){
if(prime[i]){
for(int j=i*i;j<=m;j+=i){
prime[j]=0;
}
}
}
}
void dfs(int step){
//cout<<step<<endl;
if(step==n&&prime[path[0]+path[n-1]])
{
for(int i=0;i<n;++i)
{
cout<<path[i];
if(i!=n-1)cout<<" ";
else cout<<endl;
}
return;
}
for(int i=2;i<=n;++i)
{
if(!vis[i]&&prime[i+path[step-1]])
{
path[step]=i;
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
init();
makePrimeTable();
path[0]=1;
int c=1;
while(cin>>n)
{
cout<<"Case "<<c++<<":"<<endl;
dfs(1);
cout<<endl;
}
return 0;
}