【真题来了】第七届蓝桥杯大赛个人赛(软件类)决赛真题
850
5
0
2017-04-28
华南师范大学
计算机学院

C/C++程序设计A组

 


 

1

随意组合

小明被绑架到X星球的巫师W那里。


其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7)

他命令小明从一组数据中分别取数与另一组中的数配对,共配成4对(组中的每个数必被用到)。

小明的配法是:{(8,7),(5,6),(3,4),(2,1)}


巫师凝视片刻,突然说这个配法太棒了!


因为:

每个配对中的数字组成两位数,求平方和,无论正倒,居然相等:

87^2 + 56^2 + 34^2 + 21^2  =  12302

78^2 + 65^2 + 43^2 + 12^2  =  12302


小明想了想说:“这有什么奇怪呢,我们地球人都知道,随便配配也可以啊!”

{(8,6),(5,4),(3,1),(2,7)}


86^2 + 54^2 + 31^2 + 27^2 = 12002

68^2 + 45^2 + 13^2 + 72^2 = 12002


巫师顿时凌乱了。。。。。


请你计算一下,包括上边给出的两种配法,巫师的两组数据一共有多少种配对方案具有该特征。

配对方案计数时,不考虑配对的出现次序。

就是说:

{(8,7),(5,6),(3,4),(2,1)}

{(5,6),(8,7),(3,4),(2,1)}

是同一种方案。


注意:需要提交的是一个整数,不要填写任何多余内容(比如,解释说明文字等)


2

拼棋盘

有 8x8 和 6x6 的棋盘两块(棋盘厚度相同,单面有棋盘,背面无图案)。参见【图1.png】

图片关键词


组成棋盘的小格子是同样大小的正方形,黑白间错排列。


现在需要一个10x10的大棋盘,希望能通过锯开这两个棋盘,重新组合出大棋盘。


要求:

1。 拼好的大棋盘仍然保持黑白格间错的特性。

2。 两个已有的棋盘都只允许锯一锯(即锯开为两块),必须沿着小格的边沿,可以折线锯开。

3。 要尽量保证8x8棋盘的完整,也就是说,从它上边锯下的那块的面积要尽可能小。


要求提交的数据是:4块锯好的部分的面积。按从小到大排列,用空格分开。

(约定每个小格的面积为1)


比如:10 10 26 54

当然,这个不是正确答案。


请严格按要求格式提交数据,不要填写任何多余的内容(比如,说明解释等)


3

打靶

小明参加X星球的打靶比赛。

比赛使用电子感应计分系统。其中有一局,小明得了96分。


这局小明共打了6发子弹,没有脱靶。

但望远镜看过去,只有3个弹孔。

显然,有些子弹准确地穿过了前边的弹孔。


不同环数得分是这样设置的:

1,2,3,5,10,20,25,50


那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?


下面的程序解决了这个问题。

仔细阅读分析代码,填写划线部分缺失的内容。



#include <stdio.h>

#define N 8


void f(int ta[], int da[], int k, int ho, int bu, int sc)

{

int i,j;

if(ho<0 || bu<0 || sc<0) return;

if(k==N){

if(ho>0 || bu>0 || sc>0) return;

for(i=0; i<N; i++){

for(j=0; j<da[i]; j++) 

printf("%d ", ta[i]);

}

printf("\n");

return;

}

for(i=0; i<=bu; i++){

da[k] = i;

f(ta, da, k+1, _____________ , bu-i, sc-ta[k]*i);  //填空位置

}

da[k] = 0;

}


int main()

{

int ta[] = {1,2,3,5,10,20,25,50};

int da[N];

f(ta, da, 0, 3, 6, 96);

return 0;

}



注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

Java软件开发A组

 


 

1

阶乘位数

9的阶乘等于:362880

它的二进制表示为:1011000100110000000

这个数字共有19位。


请你计算,9999 的阶乘的二进制表示一共有多少位?


注意:需要提交的是一个整数,不要填写任何无关内容(比如说明解释等)


2

凑平方数

把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。

比如:0, 36, 5948721


再比如:

1098524736

1, 25, 6390784

0, 4, 289, 15376

等等...


注意,0可以作为独立的数字,但不能作为多位数字的开始。

分组时,必须用完所有的数字,不能重复,不能遗漏。


如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?


注意:需要提交的是一个整数,不要填写多余内容。


3

棋子换位

有n个棋子A,n个棋子B,在棋盘上排成一行。

它们中间隔着一个空位,用“.”表示,比如:


AAA.BBB


现在需要所有的A棋子和B棋子交换位置。

移动棋子的规则是:

1. A棋子只能往右边移动,B棋子只能往左边移动。

2. 每个棋子可以移动到相邻的空位。

3. 每个棋子可以跳过相异的一个棋子落入空位(A跳过B或者B跳过A)。


AAA.BBB 可以走法:

移动A ==> AA.ABBB

移动B ==> AAAB.BB


跳走的例子:

AA.ABBB ==> AABA.BB


以下的程序完成了AB换位的功能,请仔细阅读分析源码,填写划线部分缺失的内容。




public class Main

{

static void move(char[] data, int from, int to)

{

data[to] = data[from];

data[from] = '.';

}

static boolean valid(char[] data, int k)

{

if(k<0 || k>=data.length) return false;

return true;

}

static void f(char[] data)

{

while(true){

boolean tag = false;

for(int i=0; i<data.length; i++){

int dd = 0; // 移动方向

if(data[i]=='.') continue;

if(data[i]=='A') dd = 1;

if(data[i]=='B') dd = -1;

if(valid(data, i+dd) && valid(data,i+dd+dd) 

&& data[i+dd]!=data[i] && data[i+dd+dd]=='.'){ 

// 如果能跳...

move(data, i, i+dd+dd);

System.out.println(new String(data));

tag = true;

break;

}

}

if(tag) continue;

for(int i=0; i<data.length; i++){

int dd = 0; // `移动方向

if(data[i]=='.') continue;

if(data[i]=='A') dd = 1;

if(data[i]=='B') dd = -1;

 

if(valid(data, i+dd) && data[i+dd]=='.'){ 

// 如果能移动...

if( _____________________ ) continue;  //填空位置

move(data, i, i+dd);

System.out.println(new String(data));

tag = true;

break;

}

}

if(tag==false) break;

}

}

public static void main(String[] args)

{

char[] data = "AAA.BBB".toCharArray();

f(data);

}

}



注意:只提交划线部分缺少的代码,不要复制已有代码或填写任何多余内容。


 



C/C++程序设计

参考答案:

1. 24  

2.  8 12 28 52

3.  ho-(i>0?1:0)


JAVA软件开发

参考答案:

1. 118445

2. 300

3. valid(data,i+dd+dd) &&(valid(data,i+dd*-1) && data[i+dd+dd]==data[i+dd*-1])


登录用户可以查看和发表评论, 请前往  登录 或  注册
Copyright 2009-2017. All Rights Reserved. SCHOLAT 学者网 版权所有 粤ICP备16019897号-1
免责声明 | 关于我们 | 用户反馈
联系我们: