zoukankan      html  css  js  c++  java
  • Hdu 1016 Prime Ring Problem (素数环经典dfs)

    Prime Ring Problem

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 20105    Accepted Submission(s): 9001

    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 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
     
    Source
     
    Recommend

    JGShining

     

    题意:素数环 (经典搜索)

    代码:

    写法1:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int yes[22];
    bool in[22];
    bool prim[50];
    int n;
    
    void primtable()
    {
        int i,j;
        memset(prim,0,sizeof(prim));
        for(i=3;i<=50;i++)
        {
            for(j=2;j<=i-1;j++)
            {
                if(i%j==0)
                    prim[i]=true;
            }
        }
    }
    
    void dfs(int pos)
    {
        int i,u;
        if(pos>n)
        {
            int m=yes[1]+yes[n];
            if(prim[m]==false)
            {
                for(i=1;i<=n;i++)
                    printf("%d%c",yes[i],i==n?'
    ':' ');
                //printf("
    ");          //这里PE了一次
            }
            return;
        }
        for(i=2;i<=n;i++)
        {
    		u=i+yes[pos-1];
            if(prim[u]==false&&in[i]==false)
            {
                yes[pos]=i;
                in[i]=true;
                dfs(pos+1);
                in[i]=false;
            }
        }
    }
    
    int main()
    {
        int cas=1;
        primtable();
        while(scanf("%d",&n)!=EOF)
        {
            memset(in,0,sizeof(in));
            yes[1]=1;
            in[1]=true;
            printf("Case %d:
    ",cas++);
            dfs(2);
            printf("
    ");
        }
        return 0;
    }
    
    // 203MS

    8765975

    2013-07-30 16:19:31

    Accepted

    1016

    203MS

    228K

    1125 B

    C++

     

     

    写法2:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int yes[22];
    bool in[22];
    bool prim[50];
    int n;
    
    void no_prim()
    {
        int tmp,i,j;
        for(i=3;i<20;i+=2)
        {
            if(prim[i]==false)
            {
                tmp=i<<1;
                for(j=i*i;j<50;j+=tmp)
                    prim[j]=true;
            }
        }
    }
    
    void dfs(int pos)
    {
        int i,u;
        if(pos>n)
        {
            int m=yes[1]+yes[n];
            if(prim[m]==false&&m%2||m==2)
            {
                for(i=1;i<=n;i++)
                    printf("%d%c",yes[i],i==n?'
    ':' ');
                //printf("
    ");
            }
            return;
        }
        for(i=2;i<=n;i++)
        {
    
            u=i+yes[pos-1];
            if((!prim[u]&&u%2||u==2)&&in[i]==false)
            {
                yes[pos]=i;
                in[i]=true;
                dfs(pos+1);
                in[i]=false;
            }
        }
    }
    
    int main()
    {
        no_prim();
        int cas=1;
        while(scanf("%d",&n)!=EOF)
        {
            memset(in,0,sizeof(in));
            yes[1]=1;
            in[1]=true;
            printf("Case %d:
    ",cas++);
            dfs(2);
            printf("
    ");
        }
        return 0;
    }
    
    // 234MS


     

    8765965

    2013-07-30 16:18:52

    Accepted

    1016

    234MS

    228K

    1143 B

    C++

  • 相关阅读:
    postgresql----UNION&&INTERSECT&&EXCEPT
    postgresql----JOIN之多表查询
    postgresql----ANY/SOME&&ALL
    在页面获取本地电脑IP
    redis-Jedis连接集群
    redis-存储命令
    redis-启用命令
    springboot-整合freemarker
    springboot-发布jar包
    springboot-实现log4j的AOP切面
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3230945.html
Copyright © 2011-2022 走看看