回溯法求解素数环问题

基本思路就是深度优先搜索,当一条路走不通的时候就回头换一种走法。

非递归版参考:
https://blog.csdn.net/tterminator/article/details/50933455

递归版:

public class PrimeCircle2 {
	//递归调用DFS
	public static void DFS(int[] place,int k,int[] visited){
		if(k>=place.length){
			return;
		}
		if(k==place.length-1){
			if(prime(place[k]+place[1])){
				for(int i = 1; i < place.length; i++){
					System.out.print(place[i]+" ");
				}
				System.out.println("");
				return;
			}
		}
		//包含了重复放置的判断
		for(int i=1;i<=place.length-1;i++){
			if(visited[i]==0 && prime(place[k]+i)){
				visited[i]=1;
				place[k+1]=i;
				DFS(place, k+1, visited);
				visited[i]=0;//回溯
			}
		}		
	}
	
	
	//判断num是否为素数
	public static boolean prime(int num){
		int root = (int) Math.sqrt(num);
		for(int i = 2; i <= root; i++){
			if(num % i == 0){
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args){
		int n = 20;
		int[] place = new int[n+1];
		int[] visited = new int[n+1];
		
		for(int i=1;i<=n;i++){
			place[i]=0;
			visited[i]=0;
		}
		visited[1]=1;
		place[1]=1;
		DFS(place,1,visited);
	}
}

你可能感兴趣的:(算法)