问题描述:
输入一个正整数,对1~n进行排列,使得相邻的两个数之和均为素数;头尾相加也要为素数。输出时从整数1开始,逆时针排序。同一个输出一次。
例如输入:6
输出:
1 4 3 2 5 6
1 6 5 2 3 4
解法一:
用DFS求解,逐步试探。
代码如下:
import java.util.*;
public class 素数环 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
if(n==1){
System.out.println("1");
System.exit(0);
}else{
arr[0] = 1;
dfs(arr, n, 1);
}
}
private static void dfs(int[] arr, int n, int cur) {
if(cur==arr.length && isP(arr[0]+arr[arr.length-1])){
//到达末尾,并且首位之和也是素数
print(arr);
}
for(int i=2; i<=n; i++){
if(check(arr, i, cur)){
arr[cur] = i;
dfs(arr, n, cur+1);
//arr[cur] = 0;//回溯,这个解法可以不回溯
}
}
}
private static void print(int[] arr) {
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+ " ");
}
System.out.println();
}
private static boolean check(int[] arr, int n, int cur) {
for(int i=0; i<cur; i++){
if(arr[i]==n) return false;
}
if(!isP(arr[cur-1]+n)) return false;
return true;
}
//判断是否是素数
private static boolean isP(int n) {
for(int i=2; i<n; i++){
if(n%i==0) return false;
}
return true;
}
}
解法二:
暴力破解,将数组进行全排列,然后对每一种排列方式进行判断,符合的就将其打印出来。但全排列算法本身就用到了递归回溯的思想,和上面差不多。而且暴力破解效率慢。