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
今日推荐
周排行