HDU 1016(dfs)

来源:互联网 发布:淘宝购物评级怎么看 编辑:程序博客网 时间:2024/06/06 04:55

题意:给一个数n,求1~n围成一个圆环,圆环相邻的两个数相加为质数,输出所有可能。

 

#include <iostream>#include <string.h>#include <math.h>#include <stdio.h>using namespace std;bool prim[40];int num[25];bool used[25];//筛法void is_prim(){    memset(prim,0,sizeof(prim));    prim[0]=prim[1]=1;    int sq=sqrt((double)40);    for(int i=2;i<sq;i++)        for(int j=i*i;j<40;j+=i)            prim[j]=1;}void dfs(int root,int n,int t){    //数组从1开始,工n个数,当t>n时,说明n个数已排好序    if(t>n&&!prim[num[n]+num[1]])    {        for(int j=1;j<n;j++)            printf("%d ",num[j]);        printf("%d\n",num[n]);        return;    }    for(int i=1;i<=n;i++)    {        if(!prim[root+i]&&!used[i])        {            num[t]=i;            used[i]=1;            dfs(i,n,t+1);            used[i]=0;        }    }}int main(){    is_prim();    int n;    int cas=1;    while(scanf("%d",&n)!=EOF)    {        memset(used,0,sizeof(used));        printf("Case %d:\n",cas++);        num[1]=1;//第一个数一定是1        used[1]=1;        dfs(1,n,2);        used[1]=0;        printf("\n");    }    return 0;}


 

0 0