题目描述
-
圆环由n个圆组成,如图所示。将自然数1、2,…,n分别放入每个圆,并且两个相邻圆中的数字总和应为质数。
-
注意:第一个圆的数目应始终为1。
-
输入值:n(0 <n <20)。
-
输出量:输出格式如下所示。每一行代表环中从顺时针和逆时针1开始的一系列圆圈编号。数字顺序必须满足上述要求。按字典顺序打印解决方案。您将编写一个完成上述过程的程序。在每种情况下都打印空白行。
代码
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[] res=new int[n];
res[0]=1;
dfs(res,1);
}
private static void dfs(int[] res, int index) {
if(index==res.length&&isPrime(res[0], res[index-1])) {
System.out.println(Arrays.toString(res));
return;
}
for (int i = 2; i <= res.length; i++) {
//i还没用过
if(!arrayContainsI(res,i)) {
//与上一个数相加是素素
if(isPrime(res[index-1], i)) {
res[index]=i;
dfs(res,index+1);
//回溯
res[index]=0;
}
}
}
}
private static boolean arrayContainsI(int[] res, int i) {
for (int x : res) {
if(i==x)
return true;
}
return false;
}
private static boolean isPrime(int i, int cur) {
if(i+cur<2) return false;
for (int j = 2; j*j<= i+cur; j++) {
if((i+cur)%j==0) return false;
}
return true;
}