hdu1016 (素数表+回溯)

来源:互联网 发布:淘宝店铺文案 编辑:程序博客网 时间:2024/04/29 08:00

题目链接: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;}



0 0