蓝桥等考C++组别
十一
级
第一部分:选择题
1、C++ L11 (15分)
下面对二维数组的定义和初始化语句,正确的是( )。
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int a[2][3] = {{1, 2}, {3, 4}, {5, 6}};
int a[][] = {{1, 2, 3}, {4, 5, 6}};
int a[][] = {{1, 2}, {3, 4}, {5, 6}};
正确答案:A
2、C++ L11 (15分)
二维数组在内存中是按行、列存储的,二维数组和矩阵的表现形式一致。已定义二维数组a[4][6]按行优先存储,那么对应矩阵的行数和列数是
( )。
4行6列
6行4列
3行5列
5行3列
正确答案:A
3、C++ L11 (20分)
执行以下程序后,a[2][2]的值是
( )。
int a[3][3];
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(i == 0 || j == 0)
a[i][j] = 1;
else
a[i][j] = 2 * a[i
-
1][j] + a[i][j
-
1];
}
}
1
5
7
17
正确答案:D
第二部分:编程题
4
、C++ L11
矩阵切块(
2
0分)
题目名称:矩阵切块
题目描述:
给定一个
m * n
的整数矩阵和两个整数x、y,输出矩阵的第x列到第y列(含第x、y列)的所有内容。
例如:当m
= 4
,n
= 5
,4
* 5
的矩阵为:
25 7 15 18 21
23 20 20 25 21
17 17 17 6 16
20 5 24 22 1
当x
= 2
,y
=
3
,输出第
2
列到第
3
列的结果为:
7 15
20 20
17 17
5 24
输入:
第一行输入4个正整数,分别为:
m(3 <= m<=
5
0),表示矩阵的行数;
n(3 <= n <=
5
0),表示矩阵的列数;
x(1<=
x
<=
5
0),表示切块的起始列号;
y(1<=
x <= y
<=
5
0),表示切块的截止列号;
相邻两个数
用
一个空格隔开。
接下来输入m行,每行包含
n
个小于1
000
的正整数,相邻两个数
用
一个空格隔开。
输出:
输出矩阵从第x列到第y列的切块,切块的每一行元素占一行,元素之间
用
一个空格隔开。
输入样例:
4 5 2 3
25 7 15 18 21
23 20 20 25 21
17 17 17 6 16
20 5 24 22 1
输出样例:
7 15
20 20
17 17
5 24
参考代码:
#include<iostream>
using namespace std;
const int N = 20;
int a[N+1][N+1];
int main()
{
int m, n, x, y;
cin >> m >> n >> x >> y;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
}
for (int i = 1; i <= m; i++)
{
for (int j = x; j <= y; j++)
{
cout << a[i][j] << ' ';
}
cout << endl;
}
return 0;
}
测试数据:
1.in
4 5 2 3
25 7 15 18 21
23 20 20 25 21
17 17 17 6 16
20 5 24 22 1
1.out
7 15
20 20
17 17
5 24
2.in
5 6 1 5
452 133 624 516 405 526
57 149 943 395 200 503
721 980 273 940 284 743
920 433 247 294 113 289
360 848 447 232 923 23
2.out
452 133 624 516 405
57 149 943 395 200
721 980 273 940 284
920 433 247 294 113
360 848 447 232 923
余下略
5、C++ L11 炸弹人(30分)
题目名称:
炸弹人
题目描述:
将一个有边界的
正方形
区域划分成n*n
的网
格,有
些
格里可能有
小怪物(每个格最多1个),你的目标是用炸弹消灭它们。炸弹只有1个,炸弹所在的位置没有
怪物
。
下面的例图中,炸弹在第3行第3列(左上角的格是第1行第1列)。
炸弹爆炸后,能
将与它同一行,同一列格子里的怪物消灭掉。如
下图
所示,黄色区域是炸弹的攻击范围
。
第3行和第3列的怪物,都因为在炸弹的攻击范围内,所以被消灭掉了。
给出区域网格的
数量
,以及
怪物和炸弹的位置,计算
炸弹爆炸后
还有多少
怪物
没被消灭
。
输入:
第一行
一
个整数
n
(
1<
n
<=
1
0
)
代表正方形
区域
每行(或
每列
)
的网格数量;
接下来
n
行,每行
n
个整数
0、1或2
,
描述n*n的区域内,
怪物和炸弹的
分布情况。0代表空地,1代表格里有怪物,2代表格里有炸弹,相邻两个数之间用空格隔开。
测试数据保证只有一个地方有炸弹
。
输出:
一个整数,代表
炸弹爆炸后没被消灭的怪物数量
。
输入样例:
5
0 0 0 0 0
0 1 1 0 0
0 0 2 1 0
0 0 0 0 0
0 0 0 0 0
输出样例:
1
参考程序:
#include <iostream>
using namespace std;
const int N = 10;
int a[N + 1][N + 1];
int main()
{
int n, x, y, enemy = 0;
cin >> n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
cin >> a[i][j];
if(a[i][j] == 1) //统计怪物的数量
{
enemy++;
}
if(a[i][j] == 2) //记下炸弹的位置
{
x = i;
y = j;
}
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if( a[i][j] == 1 && (i == x || j == y)) //如果怪物与炸弹的行或
蓝桥杯青少组C++组别11级编程练习真题(第7套,共10套)