您的位置:首页 > 编程语言 > Java开发

杭电ACM1016解题报告(Java)

2014-03-18 10:20 330 查看



==========================================真情推荐=========================================================
给大家推荐一个很吊的网站(钱宝网),个人感觉和阿里巴巴的余额宝类似,不过收益大约是余额宝的5~10倍。收益用来充话费
是足够了。并且注册就送6.6元,可立马提现。本人其身体验,保证网站真实可信。由于CSDN不允许贴推广链接。大家如果感兴趣
可以搜索“钱宝网”,第一个就是。请大家注册的时候填写激活码:5135745
===========================================================================================================

1、题目概述

该题目是一道简单的搜索类题目,通过枚举+判断找出所有的答案。

2、题目分析

问题:

给定一个整数n,按字典序输出所有的质数环。

条件:

1、Put natural number 1, 2. ..., n into each circle separately.(将自然数1-n分别放入不同的圈内)

2、and the sum of number in two adjacent circles should be a prime.(并且相邻的圈内的两个数字之和为质数)

3、Print solutions in lexicographical order.(将所有的结果按字典序输出)

3、算法设计

算法比较简单,就是:枚举+判断,如果结果满足要求就输出。

剪枝:这里有一个比较重要的剪枝,通过观察可发现,当n为奇数的时候,n+1必为偶数,所以此时不可能有符合条件的素数环。

4、编程方式

编写一个递归搜索函数,递归搜索的普遍做法是:先写出退出条件,然后再写自身递归。

数据结构:

result[],用于记录枚举的方案

used[],为一个hash表,used[i]标记数字i有没有出现在前面的枚举方案中

另外,为了提高输出效率,我们可以先将结果暂时存储在一个缓冲数组内,最后一起把结果输出。

5、代码(Java描述)

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static int[] result = new int[25];
public static boolean[] visited = new boolean[25];

public static boolean[] is_prime_table = new boolean[100];
public static void generateIs_prime_table() {
Arrays.fill(is_prime_table, true);
is_prime_table[0] = is_prime_table[1] = false;
for(int i = 2; i < 100; i ++) {
if(is_prime_table[i]) {
for(int k = i * i; k < 100; k += i) {
is_prime_table[k] = false;
}
}
}
}

public boolean isPrime(int num) {
return is_prime_table[num];
}

public void dfs(StringBuilder sb, int cur, int total) {
if(total % 2 == 1) {
return;
}
if(cur == total + 1) {
if(isPrime(result[total] + result[1])) {
for(int i = 1; i < total; i ++) {
sb.append(result[i] + " ");
}
sb.append(result[total] + "\r\n");
}
return;
}
for(int i = 2; i <= total; i ++) {
if(visited[i] == false && isPrime(result[cur - 1] + i)) {
visited[i] = true;
result[cur] = i;
dfs(sb, cur + 1, total);
visited[i] = false;
}
}
}
public StringBuilder getAns(int cas, int n) {
StringBuilder ret = new StringBuilder();
ret.append("Case ").append(cas).append(":\r\n");
Arrays.fill(visited, false);
visited[1] = true;
result[1] = 1;
dfs(ret, 2, n);
return ret;
}

public static void main(String[] args) {
generateIs_prime_table();
Scanner cin = new Scanner(System.in);
int cas = 1;
while(cin.hasNext()) {
int n = cin.nextInt();
Main obj = new Main();
StringBuilder sb = obj.getAns(cas, n);
cas ++;
System.out.println(sb.toString());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: