第七届蓝桥杯省赛C/C++B组赛题及答案

时间:2022-09-10 08:57:46

第一题

【题目】

煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

找出每一层煤球个数的规律,循环累加计算

【答案】

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,s=1,num=1;
 5     for(i=2;i<=100;i++)
 6     {
 7         s+=i;
 8         num+=s;
 9     }
10     printf("%d",num);
11     getchar();
12     return 0;
13 }

第二题

【题目】

生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

可以看做中间n项的等差数列求和,已知公差为1,Sn=236,求a1,Sn=n*a1+n*(n-1)/2,双层循环,输出符合的n和a1(题目只要a1

【答案】

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,j;
 5     for(i=1;i<120;i++)
 6     for(j=2;j<120-i;j++)
 7     if((i*j+j*(j-1)/2.0)==236) printf("%d",i);
 8     getchar();
 9     return 0;
10 } 

第三题

【题目】

凑算式

第七届蓝桥杯省赛C/C++B组赛题及答案
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

【提示】

方法一:用九层循环遍历所有可能,判断满足条件的组合;

方法二:回溯法,排列树遍历,可加入剪枝算法;

【答案】

 1 #include <stdio.h>
 2 void swap(int &a,int &b)
 3 {
 4     int t;
 5     t=a;
 6     a=b;
 7     b=t;
 8 }
 9 void output(int*x,int &count){
10     if((x[0]+x[1]*1.0/x[2]+((x[3]*100+x[4]*10+x[5])*1.0/(x[6]*100+x[7]*10+x[8])))==10.0){
11         count++;
12         printf("%d+%d/%d+%d%d%d/%d%d%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8]);
13     }
14     
15 }
16 void Backtrack(int t,int *x,int &count)
17 {
18     if(t>=9)
19         output(x,count);
20     else
21         for(int i=t;i<9;i++){
22             swap(x[t],x[i]);
23             Backtrack(t+1,x,count);
24             swap(x[t],x[i]);
25         }
26 }
27 int main()
28 {
29     int x[]={1,2,3,4,5,6,7,8,9},count=0;
30     Backtrack(0,x,count);
31     printf("%d",count);
32     return 0;
33 }

第四题

【题目】

快速排序

排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。

下面的代码是一种实现,请分析并填写划线部分缺少的代码。


#include <stdio.h>

void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

int partition(int a[], int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];
while(1){
while(i<r && a[++i]<x);
while(a[--j]>x);
if(i>=j) break;
swap(a,i,j);
}
______________________;
return j;
}

void quicksort(int a[], int p, int r)
{
if(p<r){
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}

int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;

quicksort(a, 0, N-1);

for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");

return 0;
}


注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

【提示】

理解各个函数作用即可

【答案】

 1 #include <stdio.h>
 2 
 3 void swap(int a[], int i, int j)
 4 {
 5     int t = a[i];
 6     a[i] = a[j];
 7     a[j] = t;
 8 }
 9 
10 int partition(int a[], int p, int r)
11 {
12     int i = p;
13     int j = r + 1;
14     int x = a[p];
15     while(1){
16         while(i<r && a[++i]<x);
17         while(a[--j]>x);
18         if(i>=j) break;
19         swap(a,i,j);
20     }
21     swap(a,p,j);
22     return j;
23 }
24 
25 void quicksort(int a[], int p, int r)
26 {
27     if(p<r){
28         int q = partition(a,p,r);
29         quicksort(a,p,q-1);
30         quicksort(a,q+1,r);
31     }
32 }
33     
34 int main()
35 {
36     int i;
37     int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
38     int N = 12;
39     
40     quicksort(a, 0, N-1);
41     
42     for(i=0; i<N; i++) printf("%d ", a[i]);
43     printf("\n");
44     
45     return 0;
46 }

第五题

【题目】

抽签

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
....

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。
数组a[] 中既是每个国家可以派出的最多的名额。
程序执行结果为:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,总共101行)


#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024

void f(int a[], int k, int m, char b[])
{
int i,j;

if(k==N){
b[M] = 0;
if(m==0) printf("%s\n",b);
return;
}

for(i=0; i<=a[k]; i++){
for(j=0; j<i; j++) b[M-m+j] = k+'A';
______________________; //填空位置
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
return 0;
}

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

注意:不要填写任何已有内容或说明性文字。

【提示】

理解各个函数作用即可

【答案】

 1 #include <stdio.h>
 2 #define N 6
 3 #define M 5
 4 #define BUF 1024
 5 
 6 void f(int a[], int k, int m, char b[])
 7 {
 8     int i,j;
 9     
10     if(k==N){ 
11         b[M] = 0;
12         if(m==0) printf("%s\n",b);
13         return;
14     }
15     
16     for(i=0; i<=a[k]; i++){
17         for(j=0; j<i; j++) b[M-m+j] = k+'A';
18         f(a,k+1,m-i,b);  //填空位置
19     }
20 }
21 int main()
22 {    
23     int  a[N] = {4,2,2,1,1,3};
24     char b[BUF];
25     f(a,0,M,b);
26     return 0;
27 }

第六题

【题目】

方格填数

如下的10个格子
第七届蓝桥杯省赛C/C++B组赛题及答案

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

把方格看做大小为10的数组,排列树0~9,统计满足关系的特殊排列

【答案】

 1 #include <stdio.h>
 2 #include <stdlib.h> 
 3 void swap(int &a,int &b)
 4 {
 5     int t;
 6     t=a;
 7     a=b;
 8     b=t;
 9 }
10 void output(int *x,int &count){
11     if(
12         (abs(x[0]-x[1])!=1&&abs(x[0]-x[3])!=1&&abs(x[0]-x[4])!=1&&abs(x[0]-x[5])!=1)&&
13         (abs(x[1]-x[2])!=1&&abs(x[1]-x[4])!=1&&abs(x[1]-x[5])!=1&&abs(x[1]-x[6])!=1)&&
14         (abs(x[2]-x[5])!=1&&abs(x[2]-x[6])!=1)&&
15         (abs(x[3]-x[4])!=1&&abs(x[3]-x[7])!=1&&abs(x[3]-x[8])!=1)&&
16         (abs(x[4]-x[5])!=1&&abs(x[4]-x[7])!=1&&abs(x[4]-x[8])!=1&&abs(x[4]-x[9])!=1)&&
17         (abs(x[5]-x[6])!=1&&abs(x[5]-x[8])!=1&&abs(x[5]-x[9])!=1)&&
18         (abs(x[6]-x[9])!=1)&&
19         (abs(x[7]-x[8])!=1)&&
20         (abs(x[8]-x[9])!=1)
21       )
22         count++;    
23     
24 }
25 void Backtrack(int t,int *x,int &count)
26 {
27     if(t>=10)
28         output(x,count);
29     else
30         for(int i=t;i<10;i++){
31             swap(x[t],x[i]);
32             Backtrack(t+1,x,count);
33             swap(x[t],x[i]);
34         }
35 }
36 int main()
37 {
38     int x[]={0,1,2,3,4,5,6,7,8,9},count=0;
39     Backtrack(0,x,count);
40     printf("%d",count);
41     return 0;
42 }

第七题

【题目】

剪邮票

第七届蓝桥杯省赛C/C++B组赛题及答案, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,第七届蓝桥杯省赛C/C++B组赛题及答案第七届蓝桥杯省赛C/C++B组赛题及答案中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

 

【答案】

第八题

【题目】

【提示】

【答案】