深搜

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]]);
			}
		}
	}
}
深搜代码,万变不离其宗。

猜你喜欢

转载自blog.csdn.net/asd529735325/article/details/50907168