一、思路
- dfs进行搜索,然后判断一下是否和2边的数构成质数
由于第一个必定是1,所以每次我们判断当前数和左边的数是否构成质数,构成的话就选这个数,继续枚举下一个位置,最后当到达末位置的时候还要额外判断一下与1是否构成质数 - 注意格式,打印结果最后一个数字后面没有空格,每输出完一个case进行换行
二、代码
import java.util.Scanner;
public class HDU_1016 {
static int[] rec = new int[20];
static boolean[] vis = new boolean[20];
static boolean[] is_prime = new boolean[50];
static int n, cnt = 1;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
init();
rec[0] = 1;
vis[1] = true;
while (sc.hasNext()) {
n = sc.nextInt();
System.out.println("Case " + cnt++ + ":");
dfs(1);
System.out.println(); //加上换行 否则格式错误
}
}
//初始化下质数
static void init() {
for (int i = 2; i * i < 50; i++) {
for (int j = i * i; j < 50; j += i) {
is_prime[j] = true;
}
}
}
static void dfs(int num) {
//检查一下最后一个和第一个
if (num == n && !is_prime[rec[num - 1] + rec[0]]) {
System.out.print(rec[0]); //防止最后一个数后面有空格
for (int i = 1; i < n; i++) {
System.out.print(" " + rec[i]);
}
System.out.println();
return;
}
for (int i = 1; i <= n; i++) {
if(!vis[i] && !is_prime[i + rec[num - 1]]) {
vis[i] = true;
rec[num] = i;
dfs(num + 1);
vis[i] = false;
}
}
}
}