HDU 1016 java 已Ac

来源:互联网 发布:js包含字符串 编辑:程序博客网 时间:2024/04/28 06:37

原题链接 递归的经典题型


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;}}

点击打开链接

0 0