给n个数,围成一个环,相邻两个数相加为质数
比较简单的回溯问题
类似皇后问题
算法本身没有什么好说的,很简单
需要注意的是:作为Java需要注意如果用System.out.println()输出必定会超时的
打个比方:
System.out.println()是接点水就倒了,比如接了1L水就倒了
PrintWriter要接满100L才倒
很明显第二种折腾的少一些,所以效率更高一些
具体机理其实我并不很清楚,但是可以从cout.flush()方法猜测,flush()方法是输出缓存内容
可以看到PrintWriter()构造方法传进去了一个OutputStreamWriter对象,输出流,应该是这个起到了关键作用
PrintWriter可能只是一个包装类
好吧。跑题太厉害了,算法为上,其它不必较真
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class Main {
static int[] result;
static boolean[] use;
static int n;
static boolean[] prime;
static PrintWriter cout = new PrintWriter(
new OutputStreamWriter(System.out));
public static void main(String[] args) {
prime = new boolean[41];
for (int i = 1; i < 41; i++) {
prime[i] = isPrime(i, 0);
}
Scanner sc = new Scanner(System.in);
int count = 0;
while (sc.hasNext()) {
count++;
n = sc.nextInt();
result = new int[n];
use = new boolean[n];
result[0] = 1;
use[0] = true;
cout.println("Case " + count + ":");
find(1);
cout.flush();
// 依题意打印一句空行
System.out.println();
}
}
public static void find(int t) {
if (t >= n) {
printResult();
} else if (t < n - 1) {
for (int i = 0; i < n; i++) {
if (!use[i]) {
result[t] = i + 1;
use[i] = true;
if (prime[result[t] + result[t - 1]]) {
find(t + 1);
}
use[i] = false;
}
}
} else if (t == n - 1) {
for (int i = 0; i < n; i++) {
if (!use[i]) {
result[t] = i + 1;
use[i] = true;
if (prime[result[t] + result[t - 1]]
&& prime[result[t] + result[0]]) {
find(t + 1);
}
use[i] = false;
}
}
}
}
public static void printResult() {
for (int i = 0; i < n; i++) {
if (i != 0) {
cout.print(" ");
}
cout.print(result[i]);
}
cout.println();
}
public static boolean isPrime(int a, int b) {
int sum = a + b;
for (int i = 2; i <= sum / 2; i++) {
if (sum % i == 0) {
return false;
}
}
return true;
}
}