hdu 1016 Prime Ring Problem dfs深搜算法

来源:互联网 发布:排山掌诀推算法 编辑:程序博客网 时间:2024/06/03 19:47

Prime Ring Problem

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


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)

//hdu1016//#include"stdafx.h"#include<iostream>using namespace std;#define size 30bool flag = false;bool visit[size];int behind[size];int n;//判断是否为素数bool isPrime(int a) {for (int i = 2; i < a; i++) {if (a%i == 0)return false;}return true;}//判断是否所有点都访问过bool isend() {for (int i = 1; i <= n; i++) {if (visit[i]==false)return false;}return true;}//输出满足条件的路径void print() {int next = 1;cout << "1";while (true) {next = behind[next];if (next == 1)break;cout << " " << next;}cout << endl;}void dfs(int index) {//如果所有节点都已经访问过 并且最末尾的节点和最开始的节点之和也为素数if (isend()&&isPrime(1 + index)) {behind[index] = 1;flag = true;return;}for (int i = 1; i <= n; i++) {if (i == index)continue;if (!isPrime(i + index))continue;if (visit[i])//已经访问过则跳过continue;visit[i] = true;//置已访问标记behind[index] = i;//记录路径用于输出dfs(i);if (flag) {print();flag = false;}visit[i] = false;}}int main() {int cases = 0;while (cin >> n) {cases++;cout << "Case " << cases << ":" << endl;flag = false;memset(behind, 0, sizeof(behind));memset(visit, false, sizeof(visit));visit[1] = true;dfs(1);cout << endl;}}

原创粉丝点击