2013年第四届蓝桥杯决赛Java本科B组试题解析
题目及解析如下:
题目大致介绍:
一共只有五道题
第一题和第二题是结果填空,方法不限只要得到最后结果就行
第三题是代码填空题,主要考察算法基本功和编程基本功
第四题到第六题是编程题,要求编程解决问题
第一题 猜灯谜
题目:
1 标题:猜灯谜 2 3 A 村的元宵节灯会上有一迷题: 4 5 请猜谜 * 请猜谜 = 请边赏灯边猜 6 7 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字。 8 9 请你用计算机按小明的思路算一下,然后提交“请猜谜”三个字所代表的整数即可。 10 11 请严格按照格式,通过浏览器提交答案。 12 注意:只提交一个3位的整数,不要写其它附加内容,比如:说明性的文字。
思路:直接暴力法干
1 // answer: 897 2 3 public class t1 { 4 5 public static void main(String[] args) { 6 7 int a, b, c, s, m, n; 8 9 for (a = 1; a <= 9; a++) { 10 for (b = 0; b <= 9; b++) { 11 if(a!=b) 12 for (c = 0; c <= 9; c++) { 13 if(a!=c && b!=c) 14 for (s = 0; s < 9; s++) { 15 if(a!=s && b!=s && c!=s) 16 for (m = 0; m < 9; m++) { 17 if(a!=m && b!=m && c!=m &&s!=m) 18 for (n = 0; n < 9; n++) { 19 if(a!=n && b!=n && c!=n &&s!=n && m!=n) { 20 int i = a * 100 + b * 10 + c; 21 int j = a * 100000 + s * 10000 + m * 1000 + n * 100 + s * 10 + b; 22 if(i * i == j ) { 23 System.out.println(i + " " + j); 24 } 25 } 26 } 27 } 28 } 29 } 30 } 31 } 32 33 } 34 35 }
第二题 连续奇数和
题目:
1 标题:连续奇数和 2 3 小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。 4 5 比如: 6 7 2^3 = 8 = 3 + 5 8 3^3 = 27 = 7 + 9 + 11 9 4^3 = 64 = 1 + 3 + ... + 15 10 11 虽然他没有想出怎么证明,但他想通过计算机进行验证。 12 13 请你帮助小明写出 111 的立方之连续奇数和表示法的起始数字。如果有多个表示方案,选择起始数字小的方案。 14 15 请严格按照要求,通过浏览器提交答案。 16 注意:只提交一个整数,不要写其它附加内容,比如:说明性的文字。
思路:也是暴力法直接干就完了,最后注意验算一下
1 public class t2 { 2 3 public static void main(String[] args) { 4 5 // System.out.println(111*111*111); // 1367631 6 7 for(int i = 1; i<=136763 ;i+=2) { 8 int sum = 0; 9 int cur = i; 10 while(sum <= 1367631) { 11 if(sum==1367631) { 12 System.out.println(i); 13 } 14 sum += cur; 15 cur += 2; 16 } 17 18 } 19 // 上面的代码算出来是371 下面进行一下验算 20 // test 21 System.out.println("====================="); 22 int s = 0; 23 for(int j=371; s!=1367631; j+=2) { 24 s += j; 25 // System.out.println(j); 26 } 27 System.out.println(s); 28 } 29 30 }
第三题 快速排序
题目:
1 标题:快速排序 2 3 快速排序算法是典型的分治思想的运用。它使用某个key把全部元素分成两组,其中一组的元素不大于另一组。然后对这两组再次进行递归排序。 4 5 以下代码实现了快速排序。请仔细阅读代码,填写缺少代码的部分。 6 7 static void f(int[] x, int left, int right) 8 { 9 if(left >= right) return; 10 11 int key = x[(left+right)/2]; 12 13 int li = left; 14 int ri = right; 15 while(li<=ri){ 16 while(x[ri]>key) ri--; 17 while(x[li]<key) li++; 18 19 if(________________){ //填空位置 20 int t = x[li]; 21 x[li] = x[ri]; 22 x[ri] = t; 23 li++; 24 ri--; 25 } 26 } 27 28 if(li < right) f(x, li, right); 29 if(ri > left) f(x, left, ri); 30 } 31 32 请分析代码逻辑,并推测划线处的代码,通过网页提交。 33 注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!
经典快排的实现,代码如下:
1 // 快速排序 2 3 public class t3 { 4 5 static void f(int[] x, int left, int right) 6 { 7 if(left >= right) return; 8 9 int key = x[(left+right)/2]; 10 11 int li = left; 12 int ri = right; 13 while(li<=ri){ 14 while(x[ri]>key) ri--; 15 while(x[li]<key) li++; 16 17 if(li <= ri){ //填空位置 18 int t = x[li]; 19 x[li] = x[ri]; 20 x[ri] = t; 21 li++; 22 ri--; 23 } 24 } 25 26 if(li < right) f(x, li, right); 27 if(ri > left) f(x, left, ri); 28 } 29 30 public static void main(String[] args) { 31 32 int[] arr = {3, 5, 1 ,2 , 6, 8, 7}; 33 f(arr, 0, arr.length-1); 34 for(int i=0; i<arr.length; i++) { 35 System.out.println(arr[i]); 36 } 37 38 } 39 40 }
第四题 九宫重排
题目如下:
如图1的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成图2所示的局面。
我们把图1的局面记为:12345678. 把图2的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
例如:
输入数据为:
12345678.
123.46758
则,程序应该输出:
3
再如:
输入:
13524678.
46758123.
则,程序输出:
22
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
too young too simple sometimes native!