HDU 1016 Prime Ring Problem

来源:互联网 发布:阿里云 腾讯云 华为云 编辑:程序博客网 时间:2024/04/26 22:01

给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;}}


原创粉丝点击