Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 60130 Accepted Submission(s): 25984
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
import java.util.Scanner;
public class P1016 {
public static void DFS(int a[],int color[],int parent[],int u,int count){
count++;
//递归鸿沟:当count达到n时,且a[u]+a[0]是素数
if(count==a.length&&isPrime(a[u]+a[0])){
parent[count-1]=a[u];
print(parent);
return;//返回
}
color[u]=1;//表示已经搜索--灰色
for(int v=0;v<a.length;v++){
if(color[v]==-1&&isPrime(a[u]+a[v])){
//找到一个满足条件的节点,把它记录到parent
parent[count-1]=a[u];//记录父节点
DFS(a,color,parent,v,count);
color[v]=-1;//把v还原成未搜索状态,以让后续路径能够尝试访问
}
}
}
public static void print(int parent[]){
for(int i=0;i<parent.length;i++){
if(i==parent.length-1){
System.out.println(parent[i]);
}else{
System.out.print(parent[i]+" ");
}
}
}
public static boolean isPrime(int num){
for(int i=2;i*i<=num;i++){
if(num%i==0){
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int number=0;//记录case的序号
while(sc.hasNext()){
int n=sc.nextInt();
//初始化图
int a[]=new int[n];//表示图中的n个节点,每个节点中存储一个自然数
int color[]=new int[n];
int parent[]=new int[n];
for(int i=0;i<a.length;i++){
a[i]=i+1;
color[i]=-1;
parent[i]=-1;
}
System.out.println("Case "+(++number)+":");
int count=0;//用来记录当前一次搜索进行到第几个数--递归进入的层数
DFS(a,color,parent,0,count);//深搜
System.out.println();
}
}
}