HDU1016

来源:互联网 发布:太极拳威力知乎 编辑:程序博客网 时间:2024/05/20 23:34

1.题目描述:

Prime Ring Problem

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


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
 

Source
Asia 1996, Shanghai (Mainland China)
 

Recommend
JGShining
2.题意概述:

给你1~n个数要你把它们排列成一个环使得相邻两个数相加是素数,问你这样的排列方式

3.解题思路:

首先是素数打表,然后dfs放,注意回溯!

4.AC代码:

#include <stdio.h>#include <string.h>#define N 45using namespace std;int num[20], vis[20], isprime[N], n;void getprime(){for (int i = 2; i < 8; i++){if (!isprime[i])for (int j = i * i; j < 45; j += i)isprime[j] = 1;}}void dfs(int step){if (step == n + 1 && !isprime[num[n] + num[1]]){for (int i = 1; i <= n; i++)if (i == 1)printf("%d", num[i]);elseprintf(" %d", num[i]);puts("");return;}for (int i = 2; i <= n; i++){if (!vis[i] && !isprime[num[step - 1] + i]){num[step] = i;vis[i] = 1;dfs(step + 1);vis[i] = 0;}}}int main(){int kase = 1;num[1] = 1;getprime();while (scanf("%d", &n) != EOF){memset(vis, 0, sizeof(vis));printf("Case %d:\n", kase++);dfs(2);puts("");}return 0;}

0 0