zoukankan      html  css  js  c++  java
  • UVA

                      UVA - 524 Prime Ring Problem

    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

    Description

    A ring is composed of n (even number) circles as shown in diagram. Put natural numbers $1, 2, dots, 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 <= 16)

    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.


    You are to write a program that completes above process.

    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
    

     紫书194页原题

    题解:输入正整数n,把1—n组成一个环,是相邻的两个整数为素数。输出时从整数1开始,逆时针排列。同一个环恰好输出一次,n (0 < n <= 16)

    暴力解决会超时,应用回溯法,深度优先搜索

    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int n;
    int a[20],vis[20];
    
    int isp(int n)           //判断是否为素数
    {
        if(n<2)
            return false;
        for (int i=2;i*i<=n; i++)
        {
            if(n % i == 0)
                return false;
        }
        return true;
    }
    
    void dfs(int s)
    {
        if(s==n&&isp(a[1]+a[n]))  //递归边界。别忘了测试第一个数和最后一个数
        {
            for(int i=1; i<n; i++)
                cout<<a[i]<<" ";
            cout<<a[n]<<endl;
        }
        else
        {
            for(int i=2; i<=n; i++)
            {
                if(!vis[i]&&isp(i+a[s]))   //如果i没有用过,并且与钱一个数之和为素数
                {
                    a[s+1]=i;
                    vis[i]=1;              //标记
                    dfs(s+1);
                    vis[i]=0;              //清除标记
                }
            }
        }
    }
    int main()
    {
        int t=0;
        while(cin>>n)
        {
            memset(vis,0,sizeof(vis));
            a[1]=1;
            if(t!=0) cout<<endl;            //一定注意输出格式
            t++;
            cout<<"Case "<<t<<":"<<endl;
            dfs(1);
        }
        return 0;
    }
  • 相关阅读:
    OLAP ODS项目的总结 平台选型,架构确定
    ORACLE ORA12520
    ORACLE管道函数
    ORACLE RAC JDBC 配置
    ORACLE RAC OCFS连接产生的错误
    ORACLE 启动和关闭详解
    OLAP ODS项目的总结 起步阶段
    ORACLE RAC 配置更改IP
    ORACLE RAC OCR cann't Access
    ORACLE RAC Debug 之路 CRS0184错误与CRS初始化
  • 原文地址:https://www.cnblogs.com/hfc-xx/p/4680972.html
Copyright © 2011-2022 走看看