HDU-1016-素数环

/*
将1-n个数放在环中,保证相邻的两个数的和是素数
第一个数字永远是1
就这两个约束条件
第一个难点是计算素数;
    参考文献:
    http://c.biancheng.net/cpp/html/2547.html
    http://blog.csdn.net/liukehua123/article/details/5482854

第二个部分是深度递归;
    http://blog.csdn.net/a402630999/article/details/7208218
    http://www.cnblogs.com/jiangjing/archive/2013/02/04/2891621.html
*/

#include <stdio.h>
#include <stdlib.h>
int n;
int book[21],a[21];
int isPrime[42];

int get_prime()
{    
    for(int i=2;i<8;i++)
    {
        if(!isPrime[i])
        {
            for(int j=i*i;j<42;j+=i)
                isPrime[j]=1;
        }
    }
    return 0;
}

int dfs(int x)
{
    if(x==n&&!isPrime[a[0]+a[n-1]])//最后一个已经放进去,并且最后一对首尾也满足条件
    {
        for(int i=0;i<x-1;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[x-1]);
        return 0;

    }
    for(int i=2;i<=n;i++)
    {
        if(book[i]==0&&!isPrime[a[x-1]+i])//没被使用,且上一个放进去的数和当前打算放进去的数的和是素数
        {
            a[x]=i;
            book[i]=1;
            dfs(x+1);
            book[i]=0;
        }
    }
    return 0;
}
int main()
{
    //freopen("input.txt","r",stdin);
    int num=0;
    while(scanf("%d",&n)!=EOF)
    {
        num++;
        a[0]=1;
        get_prime();
        for(int i=0;i<21;i++)
            book[i]=0;
        printf("Case %d:\n",num);
        dfs(1);
        printf("\n");
    }
    return 0;
}

 

posted @ 2017-01-10 10:18  kongchung  阅读(138)  评论(0编辑  收藏  举报