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\n",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:\n",f++);
        mem(vis1);  mem(a);
        a[0] = 1;
        dfs(1);
        printf("\n");
    }
}
posted @ 2016-04-22 17:14  Tovi  阅读(112)  评论(0编辑  收藏  举报