• HDU1016 Prime Ring Problem


    Prime Ring Problem

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


    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
     
    /*
    ID: LinKArftc
    PROG: 1016.cpp
    LANG: C++
    */
    
    #include <map>
    #include <set>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <cstdio>
    #include <string>
    #include <utility>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define eps 1e-8
    #define randin srand((unsigned int)time(NULL))
    #define input freopen("input.txt","r",stdin)
    #define debug(s) cout << "s = " << s << endl;
    #define outstars cout << "*************" << endl;
    const double PI = acos(-1.0);
    const double e = exp(1.0);
    const int inf = 0x3f3f3f3f;
    const int INF = 0x7fffffff;
    typedef long long ll;
    
    int n;
    int vis[30];
    int ans[30];
    
    bool isPrime(int x) {
        for (int i = 2; i * i <= x; i ++) {
            if (x % i == 0) return false;
        }
        return true;
    }
    
    void dfs(int cur, int cnt) {
        if (cnt > n) {
            for (int i = 1; i <= n; i ++) printf("%d%c", ans[i], i == n ? '
    ' : ' ');
            return ;
        }
        for (int i = 2; i <= n; i ++) {
            if (!vis[i] && isPrime(i + cur)) {
                if (cnt == n) {
                    if (!isPrime(i + 1)) continue;
                }
                ans[cnt] = i;
                vis[i] = true;
                dfs(i, cnt + 1);
                vis[i] = false;
            }
        }
    }
    
    int main() {
    
        int _t = 1;
        while (~scanf("%d", &n)) {
            printf("Case %d:
    ", _t ++);
            memset(vis, 0, sizeof(vis));
            vis[1] = true;
            ans[1] = 1;
            dfs(1, 2);
            printf("
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    OPENCV图像变换-1
    OPENCV形态学操作1
    OPENCV基本滤波算法
    OSX下编译安装opencv3.1.0与opencv_contrib_master
    iOS8学习笔记-构建多视图应用程序
    iOS8学习笔记2--autolayout
    iOS学习笔记1--在xcode6以上的版本中不使用storyboard以及部分控件使用
    Objective-c学习笔记3
    objective-c学习笔记2
    objective-c学习笔记
  • 原文地址:https://www.cnblogs.com/LinKArftc/p/4903206.html
Copyright © 2020-2023  润新知