HDU 1016 java 已Ac

YX_blog發表於2015-08-03

原題連結 遞迴的經典題型


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

	}

點選開啟連結

相關文章