原题链接 递归的经典题型
package cn.hncu.search;
import java.util.Scanner;
public class searchdfs {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int k=0;
while(sc.hasNext()){
int n=sc.nextInt();
int a[]=new int[n];//对数字开数组
int color[]=new int[n];//对颜色
int parents[]=new int[n];//对父节点
k++;
System.out.println("Case "+k+":");//AC题目需要
//初始化各个结点的值,颜色,父节点
for(int i=0;i<n;i++){
a[i]=i+1;
color[i]=-1;
parents[i]=-1;
}
int start=0;//第一个数
int count=0;//用于计次数,达到n 次就可以推出递归(鸿沟)
dfs(a,color,parents,start,count);//把参数传过去,进行深搜
System.out.println();//AC题目需要
}
}
private static void dfs(int[] a, int[] color, int[] parents, int u,int count) {
color[u]=1;//第一个数进来,标记为访问(1为访问,-1为没有访问过)
count++;//进一次,加一次
//递归鸿沟
if(count==a.length&&isPrime(a[u]+a[0])){//当次数达到n次且是素数时
parents[0]=u;//因为是一个环,所以最后一个结点由第一个记录
print(a,parents);//输出要求
return;//停止递归
}
for(int i=0;i<a.length;i++){//当没有满足退出的要求时候,进行下一个搜索
if(color[i]==-1 &&isPrime( a[u]+ a[i])){//没有被访问且相加的值为素数时候进去下一个搜所
parents[i]=u;//记录进去点的父节点
dfs(a,color,parents,i,count);//开始搜所
color[i]=-1;//当搜索不满足要求时候,需要还原现场
parents[i]=-1;//还原现场
}
}
}
private static void print(int[] a, int[] parents) {//输出
int index[]=new int[a.length];//由于该点记录的父节点的是上一个节点的值
int p=0;
for(int i=index.length-1;i>=0;i--){//将父节点的数字从后面往前面存起来,从0开始
index[i]=parents[p];
p=parents[p];//以后一个节点值获得前一个的值
}
int j;
for(j=0;j<index.length;j++){
if(j<index.length-1){
System.out.print( a[index[j]]+" ");//按要求输出
}else{
System.out.println(a[index[j]]);}
}
}
// 判断素数
private static boolean isPrime(int n) {
if(n==2){
return true;
}
for(int i=2;i*i<=n;i++){
if(n%i==0){
return false;
}
}
return true;
}
}