zoukankan      html  css  js  c++  java
  • hdu1016 Prime Ring Problem(DFS)

    Prime Ring Problem

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


    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
     
    //HD1016
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    static int j = 1;
    int n, a[20];
    bool prime[40], vis[20];
    
    bool is_prime(int m)//素数判断
    {
        if (m == 1)//1不是素数
            return false;
        for (int i = 2; i*i <= m; i++)//素数只能被1和本身整除
            if (m % i == 0) 
                return false;
        return true;
    }
    void dfs(int cur) 
    {
        if (cur == n && prime[a[0] + a[n - 1]])//递归出口,当到最后一个数并且首位相加为素数就结束递归 
        {
            for (int i = 0; i < n; i++) 
            {
                cout << a[i];
                if (i < n - 1)
                    cout << ' ';
                else
                    cout << endl;
            }
        }
        else 
            for (int i = 2; i <= n; i++)
            if (!vis[i] && prime[i + a[cur - 1]]) 
            {
                a[cur] = i;
                vis[i] = 1;
                dfs(cur + 1);
                vis[i] = 0;
            }
    }
    
    int main()
    {
        memset(a, 0, sizeof(a));
        memset(prime, false, sizeof(prime));
        memset(vis, false, sizeof(vis));
        for (int i = 1; i < 40; i++)
            prime[i] = is_prime(i);
        while (scanf("%d", &n) != EOF) 
        {
            a[0] = 1;
            printf("Case %d:
    ", j++);
            dfs(1);
            cout << endl;
        }
        return 0;
    }
  • 相关阅读:
    emqttd的启动脚本
    vue2的全局变量
    windows 上优雅的安装 node 和 npm
    Intent数据清理
    android 滑动刷新的实验总结
    Android 音量键拦截
    多进程通讯笔记 android aidl
    perl-Thread-Queue for openwrt
    openwrt的编译环境
    高德地图白屏的问题
  • 原文地址:https://www.cnblogs.com/-citywall123/p/9511488.html
Copyright © 2011-2022 走看看