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

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


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

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

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

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

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

#include
#include
#include
#include
#include
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


你可能感兴趣的:(ACM_Search,ACM_组合数学,全排列,深搜)