zoukankan      html  css  js  c++  java
  • DFS:Prime Ring Problem(素数环)

    解体心得:
    1、一个回溯法,可以参考八皇后问题。
    2、题目要求按照字典序输出,其实在按照回溯法得到的答案是很正常的字典序。不用去特意排序。
    3、输出有个坑,就是在输出一串的最后不能有空格,不然要PE,很尴尬。

    题目:
    Problem Description

        A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
    

    这里写图片描述

    Note: the number of first circle should always be 1
    
    Input
    n (0 < n < 20).
    
    
    Output
    The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
    
    You are to write a program that completes above process.
    
    Print a blank line after each case.
    
    
    Sample Input
    6
    8
    
    
    Sample Output
    Case 1:
    1 4 3 2 5 6
    1 6 5 2 3 4
    
    Case 2:
    1 2 3 8 5 6 7 4
    1 2 5 8 3 4 7 6 3 8 5 2
    
    
    Source
    Asia 1993 8 5 2
    
    
    Source
    Asia 19 Shanghai (Mainland China) 
    
    #include<stdio.h>
    #include<cstring>
    int n,num[21],sum,l,sum1;
    bool prim[50];
    bool bnum[21];
    int circle[21];
    int z = 1;
    
    void dfs(int sum)
    {
        if(sum == n)
        {
            if(!prim[circle[1]+circle[sum]])//判断第一个和最后一个相加是否是素数
                return;
            for(int j=1;j<=n;j++)
            {
                if(j!=n)
                    printf("%d ",circle[j]);//最后一个数字后面不可以加空格,不然要PE,很尴尬;
                else
                    printf("%d",circle[j]);
            }
            printf("
    ");
            return;
        }
        for(int i=2;i<=n;i++)
        {
            if(!bnum[i])
                continue;
            if(prim[i+circle[sum]])
            {
                circle[sum+1] = i;
                bnum[i] = false;
                dfs(sum + 1);
                bnum[i] = true;
            }
        }
        return;
    }
    int main()
    {
        //先把50以内的素数手写出来
        memset(prim,false,sizeof(prim));
        prim[2] = true;
        prim[3] = true;
        prim[5] = true;
        prim[7] = true;
        prim[11] = true;
        prim[13] = true;
        prim[17] = true;
        prim[19] = true;
        prim[23] = true;
        prim[29] = true;
        prim[31] = true;
        prim[37] = true;
        prim[41] = true;
        prim[43] = true;
        prim[47] = true;
        while(scanf("%d",&n)!=EOF)
        {
            //特判几个很大但是没有任何结果的数,直接输出,节省时间
            if(n == 19 || n == 15 || n == 11 || n == 17 || n == 13)
            {
                printf("Case %d:
    ",z++);
                printf("
    ");
                continue;
            }
            printf("Case %d:
    ",z++);
            sum1 = 0;
            l = 1;
            sum = 1;
            memset(circle,0,sizeof(circle));
            memset(bnum,true,sizeof(bnum));
            bnum[1] = false;
            circle[1]=1;
            dfs(1);
            printf("
    ");
        }
    }
    
  • 相关阅读:
    关于缓存雪崩穿透击穿等一些问题
    MethodHandler笔记
    并发总结(博客转载)
    负载均衡的几种算法Java实现代码
    SpringJdbc插入对象返回主键的值
    【Java基础】01-推荐参考材料
    【Java基础】注解
    【JSON】
    【Kafka】3-配置文件说明
    【Kafka】1-理论知识
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107383.html
Copyright © 2011-2022 走看看