题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a563f4c305b31fceafffb74e3324bacb.jpeg#pic_center)
代码:
import java.util.Scanner;
public class 素数环 {
// static int[] rec=new int[1000];
// static int n;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] rec=new int[n];
rec[0]=1;
dfs(n,rec,1);
}
private static void dfs(int n,int[] rec,int k) {
if(k==n&&isp(rec[n-1]+rec[0])) {//已经填到末尾并且首位相加为素数,成功
print(rec);
return;
}
for (int i = 2; i <= n ; i++) {//尝试用每个数字填到k这个位置
//check()的作用1.检查i是否已经在rec中,2.检查rec[k-1]和rec[k]的和是否为素数
if(check(rec,i,k)) {//rec中没有i这个数字,并且和上一个数字之和为素数
rec[k]=i;//尝试将i放在k这个位置上,并往前走一步
dfs(n,rec,k+1);
rec[k]=0;//回溯
}
}
}
private static void print(int[] rec2) {
for (int i = 0; i < rec2.length; i++) {
System.out.print(rec2[i]+" ");
}
System.out.println();
}
private static boolean check(int[] rec2, int i,int k) {
for(int e:rec2) {
if(e==i||!isp(rec2[k-1]+i))//i这个数和之前位置上的数的和是否为素数
return false;
}
return true;
}
private static boolean isp(int m) {
// TODO Auto-generated method stub
for(int i=2;i<=Math.sqrt(m);i++) {
if(m%i==0)
return false;
}
return true;
}
}