基本思路就是深度优先搜索,当一条路走不通的时候就回头换一种走法。
非递归版参考:
https://blog.youkuaiyun.com/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);
}
}