• HDU


    Prime Ring Problem

    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. 

     

    Inputn (0 < n < 20). 
    OutputThe 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



    小范围数据,当然是递归+打表啦~这里掌握某种规律后也可以提高搜索效率,比如
    素数环:给定n,1~n组成一个素数环,相邻两个数的和为素数。
          首先偶数(2例外,但是本题不会出现两个数的和为2)不是素数,
          所以素数环里奇偶间隔。如果n是奇数,必定有两个奇数相邻的情况。
          所以当n为奇数时,输出“No Answer”。
          当n == 1时只1个数,算作自环,输出1
          所有n为偶数的情况都能变成奇偶间隔的环-----所以都有结果。


    #include<stdio.h>
    #include<string.h>
    int n,c=0,i;
    int a[25],b[25];
    int jo(int a)
    {
        return a%2==0?0:1;
    }
    int prime[40]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};
    void dfs(int step)
    {
        int i;
        if(step>n&&prime[a[1]+a[n]]){
            for(i=1;i<=n;++i){
                if(i==1) printf("%d",a[i]);
                else printf(" %d",a[i]);
            }
            printf("
    ");
            return;
        }
        if(jo(a[step-1])){
            for(i=2;i<=n;i+=2){
                if(!b[i]&&prime[a[step-1]+i]){
                    b[i]=1;
                    a[step]=i;
                    dfs(step+1);
                    b[i]=0;
                }
            }
        }
        else{
            for(i=3;i<=n;i+=2){
                if(!b[i]&&prime[a[step-1]+i]){
                    b[i]=1;
                    a[step]=i;
                    dfs(step+1);
                    b[i]=0;
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d",&n)){
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            a[1]=1;b[1]=1;
            if(n==1) printf("Case %d:
    1
    
    ",++c);
            else if(!jo(n)){
                printf("Case %d:
    ",++c);
                dfs(2);
                printf("
    ");
            }
        }
        return 0;
    } 
  • 相关阅读:
    虚方法和抽象方法
    c#_实现FTP方法(一) FtpWebRequest
    sql server 分页
    5ucms进阶
    图片处理函数
    [转]C++11新特性:Lambda函数
    [STL]for_each详细用法[转]
    [算法]hash table 与 hash map 实现
    [算法]字典树
    [STL]vector的使用[转]
  • 原文地址:https://www.cnblogs.com/yzm10/p/7230924.html
Copyright © 2020-2023  润新知