杭电ACM1016解题报告(Java)
来源:互联网 发布:淘宝订单号提取卡密 编辑:程序博客网 时间:2024/05/23 22:17
==========================================真情推荐=========================================================
给大家推荐一个很吊的网站(钱宝网),个人感觉和阿里巴巴的余额宝类似,不过收益大约是余额宝的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());}}}
0 0
- 杭电ACM1016解题报告(Java)
- 杭电ACM1016(dfs)
- 杭电ACM1016
- 杭电ACM1010解题报告(编程语言Java)
- 杭电acm1016 Prime Ring Problem
- 杭电1008解题报告
- 杭电1014解题报告
- 杭电1160解题报告
- 杭电1176解题报告
- 杭电2059解题报告
- 杭电HDOJ1024 解题报告
- 杭电2028解题报告
- 杭电3342解题报告
- 杭电Robberies解题报告
- 杭电1061 解题报告
- 杭电ACM1800解题报告
- 杭电1045解题报告
- 杭电1050解题报告
- ViewFlipper实现左滑右滑的效果
- 2014年华为校招实习生机试题
- 数据结构——二项堆(C语言)
- MFC笔记
- Android开发之旅:android架构
- 杭电ACM1016解题报告(Java)
- 简单工厂模式
- 第一次写博客
- 销售订单头表的订单编号生产规则
- 苹果推送:Received fatal alert: certificate_revoked
- 运行TLD的Matlab源码的相关问题
- [操作系统设置]设置开机取消登录窗口选项直接进入桌面
- javascript:window.open
- java生成PDF