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.
Note: the number of first circle should always be 1.
![](https://i-blog.csdnimg.cn/blog_migrate/427b1dd2282412709d583cc17eda983e.gif)
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.
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
Source
//hdu1016
//#include"stdafx.h"
#include<iostream>
using namespace std;
#define size 30
bool 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;
}
}