zoukankan      html  css  js  c++  java
  • HDU1016(素数环)

    Prime Ring Problem
    Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 40069 Accepted Submission(s): 17675

    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

    [hdu1016](http://acm.hdu.edu.cn/showproblem.php?pid=1016)
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <cmath>
    #include <cstring>
    using namespace std;
    
    #define mem(a) memset(a, 0, sizeof(a))
    int a[45], vis[45], vis1[45];
    int n;
    
    void isprime() {
        vis[1] = 2;
        for (int i = 2; i<=43; i++) {
            if (!vis[i])    vis[i] = 1;
            for (int j = 2*i; j<=43; j+=i)  vis[j] = 2;
        }
    }
    
    void dfs(int num) {
        if (num == n && vis[a[0]+a[num-1]] == 1) {
            for (int i = 0; i<num-1; i++)   printf("%d ",a[i]);
            printf("%d
    ",a[num-1]);
        }
        else {
            for (int i = 2; i<=n; i++) {
                if (vis1[i] == 0) {
                    if (vis[i+a[num-1]] == 1) {
                        vis1[i] = 1;
                        a[num++] = i;
                        dfs(num);
                        num -- ;                    //回溯 
                        vis1[i] = 0;
                    }
                }
            }
        }
    }
    
    
    int main() {
        int f = 1;
        isprime();
        //for (int i = 1; i<20; i++)    cout << vis[i] << endl;
        while (scanf("%d",&n) != EOF) {
            printf("Case %d:
    ",f++);
            mem(vis1);  mem(a);
            a[0] = 1;
            dfs(1);
            printf("
    ");
        }
    }
  • 相关阅读:
    ABP框架理论研究总结(典藏版)
    ABP系列文章总目录:
    使用NServiceBus开发分布式应用
    shell脚本进阶 详解及其实例(一)
    linux模拟实现主机跨路由通信
    网络管理之基础知识详解
    RAID RAID 大揭秘~
    磁盘管理(一)磁盘结构
    如何在centos7上安装源码包
    压缩与解压缩
  • 原文地址:https://www.cnblogs.com/Tovi/p/6194801.html
Copyright © 2011-2022 走看看