问题描述
输入正整数n,对1 - n进行排列,使得相邻两个数之和均为素数
输出从1开始,逆时针排列,同一个环恰好输出一次
样例输入
6
样例输出
1 4 3 2 5 6
1 6 5 2 3 4
思路
- 此题和八皇后问题类似,采用深度优先搜索的思想
- 用一维数组存储结果,首元素定为1
- 定义整数k,表示搜索的层数(第k个数应填入哪个数),递归地搜索下一层,直到k=n则表示一种排列方法
代码
import java.util.Scanner;
public class PrimeCircle {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
input.close();
int[] array = new int[n];
array[0] = 1;
dfs(array,1);
}
private static void dfs(int[] array ,int k) {
if(k == array.length && isPrime(array[0] + array[array.length - 1])) {//首尾的两个数之和也应为素数
print(array);
}
for (int i = 2; i <= array.length; i++) {
if(check(i,array,k)) {
array[k] = i;
dfs(array, k + 1);
}
}
}
private static void print(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
private static boolean check(int i, int[] array, int k) {
int flag = 0;
for (int j = 0; j < k; j++) {
if(array[j] == i) {
flag = 1;
break;
}
}
if(flag == 0 && isPrime(i + array[k - 1]))
return true;
return false;
}
private static boolean isPrime(int i) {
for (int j = 2; j *j <= i; j++) {
if(i % j == 0)
return false;
}
return true;
}
}