HDU1016Prime Ring Problem(无重复排列+深搜)

来源:互联网 发布:蚁群算法和遗传算法 编辑:程序博客网 时间:2024/04/30 02:09

题意:环构成的n周期图所示。将自然数1,2,...,n为进每个圆圈分开,在两个相邻的圆圈中的数字的总和应该是素数。注意:第一个圆的数目应该始终为1。


http://acm.hdu.edu.cn/showproblem.php?pid=1016

题解:运用非重复排列的模板+适当的减枝;

错误分析:1:素数判定时写错了;

2;n重复定义;导致没有输出;

3:没有判断第一个元素与最后一个的和是否为素数;不过还是一遍AC了,嘿嘿;

#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<cstdlib>using namespace std;int prime[40];//存储下标是否为素数int use[20];//标记是否使用int ret[20];//存储排列的元素;int n;void judge()//素数判定,打表列出;{    int i,j;    prime[0]=prime[1]=1;    for(i=2;i<40;i++)    {        if(!prime[i])        {            for(j=2*i;j<40;j+=i)            {                prime[j]=1;            }        }    }}void unrepeat_comb(int l)//非重复排列;{    int i;    if(l==n+1)    {        if(prime[ret[1]+ret[n]])return;//当第一个数与最后一个数的和不是素数时,不输出,直接返回;        for(i=1;i<n;i++)        printf("%d ",ret[i]);        printf("%d\n",ret[i]);    }    for(i=2;i<=n;i++)    {        if(!use[i])        {            if(!prime[i+ret[l-1]])//如果相邻的数和不是素数,继续循环;            {                use[i]=1;                ret[l]=i;                unrepeat_comb(l+1);                use[i]=0;            }            else                continue;        }    }}int main(){    judge();    int count=0;    while(scanf("%d",&n)!=EOF)    {        ret[1]=1;        printf("Case %d:\n",++count);       memset(use,0,sizeof(use));       unrepeat_comb(2);       printf("\n");    }    return 0;}