HDU 1016 Prime Ring Problem

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

	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值