HDU 1016 Prime Ring Problem

本文讨论了如何高效地解决回溯问题,并通过对比System.out.println()和PrintWriter来优化输出流程,以减少输出操作对性能的影响。重点介绍了在Java中使用PrintWriter进行大规模数据输出的方法和原理。

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

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值