zoukankan      html  css  js  c++  java
  • 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;
    }

    作者: 点A点C

    出处: http://www.cnblogs.com/ACshasow/>

    关于作者:游戏开发、算法研究,请多多赐教!

    本文版权归作者(点A点C)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(572779130@qq.com)咨询.

  • 相关阅读:
    ZOJ1450 BZOJ1136 BZOJ1137 HDU3932[最小圆覆盖]
    POJ 1755 Triathlon [半平面交 线性规划]
    POJ 3384 Feng Shui [半平面交]
    POJ 3525 Most Distant Point from the Sea [半平面交 二分]
    POJ 1279 Art Gallery [半平面交]
    POJ3335 POJ3130 POJ1474 [半平面交]
    POJ 3608 Bridge Across Islands [旋转卡壳]
    nginx访问量统计
    PV UV QPS 并发数
    PV、UV、IP之间的区别与联系
  • 原文地址:https://www.cnblogs.com/ACshasow/p/2772187.html
Copyright © 2011-2022 走看看