码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1016 Prime Ring Problem

时间:2018-09-05 17:48:24      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:int   [1]   write   script   https   namespace   时间   http   with   

题目链接:HDU 1016

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

题意

有这样一个环,环上n个点,这n个点由1-n这n个数组成,其中第一个点固定是1,且保证任意相连的两个数之和是素数,在输入n以后把所有符合条件的数字排列输出。

题解:

虽然是n<20,其实数据还是很大的,用DFS去跑,符合条件就输出,在本地运行时,发现当n为奇数时无解,就加上了奇偶判断,节省了一定的时间。另外在初始化时打一个素数表,注意下细节这就是道简单题。

代码

#include<string>
#include<cstring>
using namespace std;
int n;
int state[22] = { 0 };
bool prime[110] = { 0 };
void Init() {
    for (int i(2); i < 45; i++)
        for (int j(2); i*j <= 45; j++)
            prime[i*j] = 1;
}
int a[22] = { 1,1 };
int ans;
void dfs(int x) {
    if (x == n+1) {
        if (!prime[a[n]+ a[1]]) {
            ans++;
            for (int i(1); i <= n; i++) {
                if (i > 1)
                    cout << ‘ ‘;
                cout << a[i];
            }
            cout << endl;
            return;
        }
        else return;
    }
    for (int i(2); i <= n; i++) {
        if (!state[i]&&!prime[i + a[x - 1]]) {
            a[x] = i;
            state[i] = 1;
            dfs(x + 1);
            state[i]=0;
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    Init();
    int Case = 1;
    while (cin >> n,n) {
        ans = 0;
        memset(state, 0, sizeof state);
        cout << "Case " << Case++ << ":" << endl;
        dfs(2);
        cout <<ans<< endl;
    }
}

HDU 1016 Prime Ring Problem

标签:int   [1]   write   script   https   namespace   时间   http   with   

原文地址:https://www.cnblogs.com/Titordong/p/9592273.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!