Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 37992 Accepted Submission(s): 16812
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.
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
Recommend
题意:输出满足相邻的相加是素数的序列(注意不要重复),每次都是从1开始。
思路就是深搜思想把每种情况遍历一次,从1开始,满足每次相邻的相加都为素数。
//HDU_1016
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int visited[21],a[21],n; //visited作为标记存储,a存环形数列
bool isPrime(unsigned long n) { //判断是否是素数
if (n <= 3) {
return n > 1;
} else if (n % 2 == 0 || n % 3 == 0) {
return false;
} else {
for (unsigned short i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
}
void DFS (int num){
int i;
if(num == n && isPrime(a[num - 1]+a[0])){ //如果1到n的数取完,注意:还必须得1和最后一个数的和是否是素数
for(i = 0; i < num - 1; i++) //如果满足条件,输出
printf("%d ",a[i]);
printf("%d\n",a[num - 1]);
}
else{
for(i = 2; i <= n; i++){
if(visited[i] == 0 && isPrime(i + a[num - 1])){ //判断是否用过,和相邻两个和是否满足素数条件
visited[i] = -1; //用过标记
a[num++] = i; //放进数组
DFS(num); //递归DFS
visited[i] = 0; //退去标记
num--; //回溯,换一个节点接着深搜
}
}
}
}
int main(){
int num = 0;
while(scanf("%d",&n) != EOF){
num++;
printf("Case %d:\n",num);
memset(visited,0,sizeof(visited));
a[0] = 1;
DFS(1);
printf("\n");
}
}