热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2014年第五届蓝桥杯决赛Java本科B组试题解析

第一题国王的遗产X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。其中,大儿子分14&#x

 

 

 

第一题  国王的遗产

X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。
其中,大儿子分1/4,二儿子1/5,三儿子1/6,....
直到小儿子分1/9。
牛是活的,不能把一头牛切开分。

最后还剩下11头牛,分给管家。

请计算国王这批遗产中一共有多少头牛。

这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)

1 // 国王的遗产
2
3 public class t1 {
4
5 public static void main(String[] args) {
6
7 for (int i &#61; 12; i <&#61; 10000; i&#43;&#43;) {
8 if (i % 4 &#61;&#61; 0 && i % 5 &#61;&#61; 0 && i % 6 &#61;&#61; 0 && i % 7 &#61;&#61; 0 && i % 8 &#61;&#61; 0 && i % 9 &#61;&#61; 0) {
9 if (i - i / 4 - i / 5 - i / 6 - i / 7 - i / 8 - i / 9 &#61;&#61; 11) {
10 System.out.println(i);
11 }
12 }
13 }
14 // answer: 2520
15
16 // 验算
17 System.out.println(
18 2520 / 4 &#43; " " &#43; 2520 / 5 &#43; " " &#43; 2520 / 6 &#43; " " &#43; 2520 / 7 &#43; " " &#43; 2520 / 8 &#43; " " &#43; 2520 / 9);
19 int res &#61; 2520 - 2520 / 4 - 2520 / 5 - 2520 / 6 - 2520 / 7 - 2520 / 8 - 2520 / 9;
20 System.out.println(res);
21 }
22
23 }

 

 

第二题  六角幻方

把 1 2 3 ... 19 共19个整数排列成六角形状&#xff0c;如下&#xff1a;

    * * *
  * * * *
 * * * * *
  * * * *
   * * *

要求每个直线上的数字之和必须相等。共有15条直线哦&#xff01;

再给点线索吧&#xff01;我们预先填好了2个数字&#xff0c;第一行的头两个数字是&#xff1a;15 13&#xff0c;参见图【p1.png】&#xff0c;黄色一行为所求

 

请你填写出中间一行的5个数字。数字间用空格分开。

这是一行用空格分开的整数&#xff0c;请通过浏览器提交答案&#xff0c;不要填写任何多余的内容&#xff08;比如说明性的文字等&#xff09;

 
解决思路&#xff1a;DFS

1 // 六角幻方
2 // 每一行的和应该是38 (1到19的和是190&#xff0c;190/5&#61;38)
3
4 public class t2 {
5
6 public static boolean[] vis &#61; new boolean[20];
7 public static int[] a &#61; new int[20];
8
9 public static void dfs(int x) {
10 // 剪枝
11 if (x &#61;&#61; 8) {
12 if (a[4] &#43; a[5] &#43; a[6] &#43; a[7] !&#61; 38)
13 return;
14 }
15 if (x &#61;&#61; 9) {
16 if (15 &#43; a[4] &#43; a[8] !&#61; 38)
17 return;
18 }
19 if (x &#61;&#61; 13) {
20 if (a[8] &#43; a[9] &#43; a[10] &#43; a[11] &#43; a[12] !&#61; 38)
21 return;
22 if (a[3] &#43; a[7] &#43; a[12] !&#61; 38)
23 return;
24 }
25 if (x &#61;&#61; 14) {
26 if (38 !&#61; 13 &#43; a[5] &#43; a[9] &#43; a[13])
27 return;
28 }
29 if (x &#61;&#61; 17) {
30 if (13 &#43; a[6] &#43; a[11] &#43; a[16] !&#61; 38 || a[13] &#43; a[14] &#43; a[15] &#43; a[16] !&#61; 38)
31 return;
32 }
33 if (x &#61;&#61; 18) {
34 if (a[3] &#43; a[6] &#43; a[10] &#43; a[14] &#43; a[17] !&#61; 38 || a[8] &#43; a[13] &#43; a[17] !&#61; 38)
35 return;
36 }
37 if (x &#61;&#61; 19) {
38 if (a[7] &#43; a[11] &#43; a[15] &#43; a[18] !&#61; 38 || a[4] &#43; a[9] &#43; a[14] &#43; a[18] !&#61; 38)
39 return;
40 }
41 if (x &#61;&#61; 20) {
42 // 最后出口
43 if (a[17] &#43; a[18] &#43; a[19] &#61;&#61; 38) {
44 System.out.println(a[8] &#43; " " &#43; a[9] &#43; " " &#43; a[10] &#43; " " &#43; a[11] &#43; " " &#43; a[12]);
45 // answer: 9 6 5 2 16
46 return;
47 }
48 }
49 for (int i &#61; 1; i <20; i&#43;&#43;) {
50 if (!vis[i]) {
51 vis[i] &#61; true;
52 a[x] &#61; i;
53 dfs(x &#43; 1);
54 vis[i] &#61; false;
55 }
56 }
57 }
58
59 public static void main(String[] args) {
60
61 a[1] &#61; 15;
62 a[2] &#61; 13;
63 a[3] &#61; 10;
64 vis[15] &#61; vis[13] &#61; vis[10] &#61; true;
65 dfs(4);
66
67 }
68
69 }

 

 

第三题  格子放鸡蛋

1 X星球的母鸡很聪明。它们把蛋直接下在一个 N * N 的格子中&#xff0c;每个格子只能容纳一枚鸡蛋。它们有个习惯&#xff0c;要求&#xff1a;每行&#xff0c;每列&#xff0c;以及每个斜线上都不能有超过2个鸡蛋。如果要满足这些要求&#xff0c;母鸡最多能下多少蛋呢&#xff0c;有多少种摆放方法呢&#xff1f;
2
3
4 下面的程序解决了这个问题&#xff0c;请仔细分析程序逻辑&#xff0c;推断划线处缺少的代码。
5
6 public class A
7 {
8 static int max &#61; 0;
9 static int T &#61; 0;
10 static final int N &#61; 6;
11
12 // 只能在(r,c) 以及其右&#xff0c;其下放置
13 static void f(int[][] da, int r, int c)
14 {
15 if(r>&#61;N){
16 int n &#61; count(da);
17 if(n>max) {
18 max &#61; n;
19 T &#61; 0;
20 }
21 if(n&#61;&#61;max) T&#43;&#43;;
22 return;
23 }
24
25 //计算一下步放哪
26 int r_next &#61; r;
27 int c_next &#61; c &#43; 1;
28 if(c_next>&#61;N){
29 c_next &#61; 0;
30 r_next&#43;&#43;;
31 }
32
33 if(____________________){ // 填空位置
34 da[r][c] &#61; 1;
35 f(da, r_next, c_next);
36 }
37
38 da[r][c] &#61; 0;
39 f(da, r_next, c_next);
40 }
41
42 static int count(int[][] da)
43 {
44 int n &#61; 0;
45
46 for(int i&#61;0; i)
47 for(int j&#61;0; j)
48 if(da[i][j]&#61;&#61;1) n&#43;&#43;;
49
50 return n;
51 }
52
53 static int spy(int[][] da, int r, int c)
54 {
55 int m&#61;0;
56
57 // 该行
58 int n&#61;0;
59 for(int i&#61;0; iif(da[r][i]&#61;&#61;1) n&#43;&#43;;
60 if(n>m) m &#61; n;
61
62 //该列
63 n&#61;0;
64 for(int i&#61;0; iif(da[i][c]&#61;&#61;1) n&#43;&#43;;
65 if(n>m) m &#61; n;
66
67 //右斜线
68 n&#61;0;
69 for(int i&#61;0; i){
70 if(r-i<0 || c-i<0) break;
71 if(da[r-i][c-i]&#61;&#61;1) n&#43;&#43;;
72 }
73 for(int i&#61;1; i){
74 if(r&#43;i>&#61;N || c&#43;i>&#61;N) break;
75 if(da[r&#43;i][c&#43;i]&#61;&#61;1) n&#43;&#43;;
76 }
77 if(n>m) m &#61; n;
78
79 //左斜线
80 n&#61;0;
81 for(int i&#61;0; i){
82 if(r-i<0 || c&#43;i>&#61;N) break;
83 if(da[r-i][c&#43;i]&#61;&#61;1) n&#43;&#43;;
84 }
85 for(int i&#61;1; i){
86 if(r&#43;i>&#61;N || c-i<0) break;
87 if(da[r&#43;i][c-i]&#61;&#61;1) n&#43;&#43;;
88 }
89 if(n > m) m &#61; n;
90
91 return m;
92 }
93
94 public static void main(String[] args)
95 {
96 int[][] da &#61; new int[N][N];
97
98 f(da, 0, 0);
99
100 System.out.println(max);
101 System.out.println(T);
102 }
103 }
104
105 注意&#xff1a;通过浏览器提交答案。只填写缺少的内容&#xff0c;不要填写任何多余的内容&#xff08;例如&#xff1a;说明性文字或已有符号&#xff09;。

解决思路&#xff1a;经典算法N皇后问题的变体&#xff0c;读完题可以知道大概是要根据spy函数的调用结果来判断

1 public class t3 {
2
3 static int max &#61; 0;
4 static int T &#61; 0;
5 static final int N &#61; 6;
6
7 // 只能在(r,c) 以及其右&#xff0c;其下放置
8 static void f(int[][] da, int r, int c) {
9 if (r >&#61; N) {
10 int n &#61; count(da);
11 if (n > max) {
12 max &#61; n;
13 T &#61; 0;
14 }
15 if (n &#61;&#61; max)
16 T&#43;&#43;;
17 return;
18 }
19
20 // 计算一下步放哪
21 int r_next &#61; r;
22 int c_next &#61; c &#43; 1;
23 if (c_next >&#61; N) {
24 c_next &#61; 0;
25 r_next&#43;&#43;;
26 }
27
28 if (spy(da, r, c) <2) { // 填空位置
29 da[r][c] &#61; 1;
30 f(da, r_next, c_next);
31 }
32
33 da[r][c] &#61; 0;
34 f(da, r_next, c_next);
35 }
36
37 static int count(int[][] da) {
38 int n &#61; 0;
39
40 for (int i &#61; 0; i )
41 for (int j &#61; 0; j )
42 if (da[i][j] &#61;&#61; 1)
43 n&#43;&#43;;
44
45 return n;
46 }
47
48 static int spy(int[][] da, int r, int c) {
49 int m &#61; 0;
50
51 // 该行
52 int n &#61; 0;
53 for (int i &#61; 0; i )
54 if (da[r][i] &#61;&#61; 1)
55 n&#43;&#43;;
56 if (n > m)
57 m &#61; n;
58
59 // 该列
60 n &#61; 0;
61 for (int i &#61; 0; i )
62 if (da[i][c] &#61;&#61; 1)
63 n&#43;&#43;;
64 if (n > m)
65 m &#61; n;
66
67 // 右斜线
68 n &#61; 0;
69 for (int i &#61; 0; i ) {
70 if (r - i <0 || c - i <0)
71 break;
72 if (da[r - i][c - i] &#61;&#61; 1)
73 n&#43;&#43;;
74 }
75 for (int i &#61; 1; i ) {
76 if (r &#43; i >&#61; N || c &#43; i >&#61; N)
77 break;
78 if (da[r &#43; i][c &#43; i] &#61;&#61; 1)
79 n&#43;&#43;;
80 }
81 if (n > m)
82 m &#61; n;
83
84 // 左斜线
85 n &#61; 0;
86 for (int i &#61; 0; i ) {
87 if (r - i <0 || c &#43; i >&#61; N)
88 break;
89 if (da[r - i][c &#43; i] &#61;&#61; 1)
90 n&#43;&#43;;
91 }
92 for (int i &#61; 1; i ) {
93 if (r &#43; i >&#61; N || c - i <0)
94 break;
95 if (da[r &#43; i][c - i] &#61;&#61; 1)
96 n&#43;&#43;;
97 }
98 if (n > m)
99 m &#61; n;
100
101 return m;
102 }
103
104 public static void main(String[] args) {
105 int[][] da &#61; new int[N][N];
106
107 f(da, 0, 0);
108
109 System.out.println(max);
110 System.out.println(T);
111 }
112
113 }

 


转载于:https://www.cnblogs.com/wyb666/p/10872024.html


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
author-avatar
窝窝笑丫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有