本文版权归点A点C和博客园共有,欢迎转载,但必须保留此段声明,并给出原文连接,谢谢合作!!!

hdu1016Prime Ring Problem(经典DFS)

题目很简单就是输入一个数n,之后把1-n放入一个圆环中使每个数与它两边的任意一个数相加都是素数,把所有可能的排列情况输出出来。

ps:刚开始练深搜,当时对那个输出所有的可能的情况那个递归迷糊了半天。

代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
int n;
int temp;//记录已经有多少个节点有数
int r[21];//记录每个节点的数的值
bool vis[21];//记录每个节点是否存在数
bool prime[40];//对40之内的数进行素数的判定,如果是素数则标记为1反之则标为0
bool judge(int n)//素数判定的函数
{
    int k;
    if(n==2)
    return true;
    else if (n==1||n==0)
    return false;
    for(k=2;k<=int(sqrt(double(n)));k++)
    {
        if(n%k==0)
        return false;
    }
    return true;
}
void DFS(int step)//step代表当前节点的数值,i表示下一节点的值
{
    int i,j;
    for(i=2;i<=n;i++)
    {
        if(!vis[i]&&prime[i+step])
        {
            r[temp++]=i;
            vis[i]=true;
            DFS(i);
            vis[i]=false;
            temp--;
        }
    }
        if(temp==n+1&&prime[1+r[n]])
        {
            for(j=1;j<=n;j++)
            {
                if(j!=1)
                printf(" ");
                printf("%d",r[j]);
            }
            printf("\n");
        }
}
int main()
{
    int i,k;
    for(i=1;i<=40;i++)
    {
        if(judge(i))
        prime[i]=true;
        else
        prime[i]=false;
    }
    r[1]=1;//第一个数永远为1
    temp=2;//第一个数已经确定所以从第二个数开始搜索
    k=1;
    while(scanf("%d",&n)!=EOF)
    {
        printf("Case %d:\n",k++);
        memset(vis,false,sizeof(vis));
        vis[1]=true;
        DFS(1);
        printf("\n");
    }
    return 0;
}

 

posted on 2012-11-15 20:19  点A点C  阅读(229)  评论(0编辑  收藏  举报

导航