HDU 1016 Prime Ring Problem

来源:互联网 发布:qt5 socket编程 编辑:程序博客网 时间:2024/05/16 19:02
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
68
 

Sample Output
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2
#include <cstdio>#include <cstring>#define N 25bool isPrime[N];int ring[N];int pr;bool visit[N];int n, count;void setPrime(){memset(isPrime, true, sizeof(isPrime));isPrime[0] = isPrime[1] = false;for (int i = 2; i < N; i++) if (isPrime[i])for (int j = 2 * i; j < N; j += i)isPrime[j] = false;}void print(){printf("1");for (int i = 2; i <= n; i++) printf(" %d", ring[i]);printf("\n");}void dfs(int i){if (i > n){if (isPrime[ring[n] + 1]) print();return;}for (int j = 2; j <= n; j++)if (!visit[j] && isPrime[ring[i - 1] + j]){ring[++pr] = j;visit[j] = true;dfs(i + 1);pr--;visit[j] = false;}}int main(){setPrime();count = 0;while (~scanf("%d", &n)){printf("Case %d:\n", ++count);memset(visit, false, sizeof(visit));ring[1] = 1; pr = 1;dfs(2);printf("\n");}return 0;}

0 0
原创粉丝点击