package DFS;
import java.util.Scanner;
public class SearchMethodDFS {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
while(sc.hasNext()){
int n=sc.nextInt();
int a[]=new int [n]; //开数组内存
int color[]=new int [n]; //设颜色,-1代表没有访问过,1代表访问过
int parents[]=new int [n]; //用来记录父节点,把父节点放在其中
for(int i=0;i<a.length;i++){ //初始化值
a[i]=i+1;
color[i]=-1;
parents[i]=-1;
}
int startNode=0; //表示开始节点
int count=0; //计数,如果满a.length则表示已经把所以值遍历完了
dfs(a,color,parents,startNode,count); //进行深搜,以下深搜用的递归,注:深搜用递归,广搜用队列
}
}
private static void dfs(int[] a, int[] color, int[] parents, int v,int count) {
count++; //每次进去使count+1
color[v]=1; //记录该节点已经被访问过,1表示访问过,-1表示没有访问过
if(count==a.length && isprime(a[v]+a[0])){ //当满足条件的时候输出结果值 ,注:此处必须判断最后一个数与第一个数即a[0]的和是不是素数
//System.out.println(a[v]);
parents[0]=v;
print(a, parents);
}
for(int i=1;i<a.length;i++){ //查找满足条件(相邻节点与之相加是素数的节点)
if(isprime(a[v]+a[i])&&color[i]==-1){
parents[i]=v; //把满足条件的节点位置赋给父节点
dfs(a, color, parents, i, count); //开始递归
color[i]=-1; //注:此处必须把其他节点返回成-1,因为每进一次那些节点都会变1,所以要变回来,不然没法继续
parents[i]=-1;
}
}
}
private static boolean isprime(int i) { //判断是不是素数的方法
if(i==2){
return true;
}
for(int j=2;j*j<=i;j++){
if(i%j==0){
return false;
}
}
return true;
}
private static void print(int a[],int parents[]){ //打印的方法
int index[]=new int [parents.length];
int p=0;
for(int i=0;i<parents.length;i++){
index[parents.length-i-1]=parents[p];
p=parents[p];
}
for(int j=0;j<index.length;j++){
if(j<index.length-1){
System.out.print(a[index[j]]+" ");
}else{
System.out.println(a[index[j]]);
}
}
}
}
深搜代码,万变不离其宗。