DFS 素数环
如图所示为一个由n个圆圈构成的圆环。将自然数1,2,…,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?
注意:圆圈中的数字一定是从1开始的,并且连续不重复。
输入
6
8
输出
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
代码
public static void main(String[] args) {
Scanner kb=new Scanner(System.in);
int n=kb.nextInt();
int a[]=new int [n];
a[0]=1;
dfs(1,n,a);
}
private static void dfs(int k, int n, int[] a) {
// TODO Auto-generated method stub
if (k==n&&isPrime(a[0]+a[n-1])) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+(i==a.length-1?"": " "));
}
System.out.println();
return;
}
for (int i = 2; i <=n; i++) {//尝试每个数字填到k这个位置
if (check(i,a,k)) {//a中没有i这个数字,且加上上一个数字和位素数
a[k]=i;
dfs(k+1, n, a);
a[k]=0;
}
}
}
private static boolean check(int i, int[] a, int k) {
for (int j = 0; j < a.length; j++) {
if (a[j] == i || !isPrime(a[k - 1] + i)) {
return false;
}
}
return true;
}
private static boolean isPrime(int i) {
for (int j = 2; j <=Math.sqrt(i); j++) {
if (i%j==0) {
return false;
}
}
return true;
}