2025年6月GESP真题(程序题1)
题目要求按给定坐标裁剪字符矩阵。输入画布行数h、列数w,裁剪范围x1,x2,y1,y2,以及h行w列的字符矩阵。输出x1到x2行、y1到y2列的子矩阵。代码使用二维数组存储画布,通过双重循环输出指定区域,注意行末换行处理。这是一道考察二维数组和循环控制的基础编程题,适合练习数组操作和边界处理。
hi,我是小汉堡,今天我们讲一道程序题,是GESP的真题,如果还没找到前面的小题的解析,可以来看这一篇2025年6月GESP四级真题解析(免费)
文章目录
题目链接
题目
题目描述
小 A 在高为 h h h 宽为 w w w 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为 h h h 行 w w w 列的字符矩阵,其中的字符均为 ASCII 码位于 33 ∼ 126 33 \sim 126 33∼126 之间的可见字符,小 A 只保留画布中由第 x 1 x_1 x1 行到第 x 2 x_2 x2 行、第 y 1 y_1 y1 列到第 y 2 y_2 y2 列构成的子矩阵。
小 A 将画布交给了你,你能帮他完成画布的裁剪吗?
输入格式
第一行,两个正整数 h , w h, w h,w,分别表示画布的行数与列数。
第二行,四个正整数 x 1 , x 2 , y 1 , y 2 x_1, x_2, y_1, y_2 x1,x2,y1,y2,表示保留的行列边界。
接下来 h h h 行,每行一个长度为 w w w 的字符串,表示画布内容。
输出格式
输出共 x 2 − x 1 + 1 x_2 - x_1 + 1 x2−x1+1 行,每行一个长度为 y 2 − y 1 + 1 y_2 - y_1 + 1 y2−y1+1 的字符串,表示裁剪后的画布。
输入输出样例 #1
输入 #1
3 5
2 2 2 4
.....
.>_<.
.....
输出 #1
>_<
输入输出样例 #2
输入 #2
5 5
1 2 3 4
AbCdE
fGhIk
LmNoP
qRsTu
VwXyZ
输出 #2
Cd
hI
说明/提示
对于所有测试点,保证 1 ≤ h , w ≤ 100 1 \leq h, w \leq 100 1≤h,w≤100, 1 ≤ x 1 ≤ x 2 ≤ h 1 \leq x_1 \leq x_2 \leq h 1≤x1≤x2≤h, 1 ≤ y 1 ≤ y 2 ≤ w 1 \leq y_1 \leq y_2 \leq w 1≤y1≤y2≤w。
题目解释
读懂的略过
这道题的意思就是,要把一个小盆友画的画进行裁剪,裁剪的坐标已经告诉了我们,我们只需要把裁剪的坐标进行输出就好了
样例解释1
3 5
2 2 2 4
.....
.>_<.
.....
由题意可知, 3 , 5 3,5 3,5表示小A的画的原版画的大小, 3 3 3是行数, 5 5 5是列数。接着输入了裁剪的坐标。最后输入了小A的原版画。
接着进行裁剪,首先是行,从第 2 2 2行裁剪到第 2 2 2行,也就是裁剪出了第 2 2 2行;然后是列,从第 2 2 2列裁剪到第 4 4 4列,也就是裁剪出了第 2 , 3 , 4 2,3,4 2,3,4列。
最后输出,第二行的第 2 , 3 , 4 2,3,4 2,3,4列
>_<
样例解释2
5 5
1 2 3 4
AbCdE
fGhIk
LmNoP
qRsTu
VwXyZ
进行裁剪,首先是行,从第 1 1 1行裁剪到第 2 2 2行,也就是裁剪出了第 1 , 2 1,2 1,2行;然后是列,从第 3 3 3列裁剪到第 4 4 4列,也就是裁剪出了第 3 , 4 3,4 3,4列。
最后输出,第 1 , 2 1,2 1,2行的第 3 , 4 3,4 3,4列
Cd
hI
代码
下面是我写的代码,格式不知道你习惯不习惯
#include<bits/stdc++.h>
using namespace std;
char a[101][101];
int main(){
int n,m;
cin>>n>>m;
int x1,x2,y1,y2;
cin>>x1>>x2>>y1>>y2;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(j==y2)
cout<<a[i][j]<<endl;
else
cout<<a[i][j];
}
}
return 0;
}
代码解析
第3行: 定义了一个char类型的二维数组,用来存小A的原版画,为啥是字符类型,因为他的画不光有数字,还有很多非数字的字符。为啥定义的一个 101 × 101 101 \times 101 101×101的二维数组呢?因为题上说 1 ≤ h , w ≤ 100 1 \leq h, w \leq 100 1≤h,w≤100,这说明小A画的画不会大于 100 × 100 100\times100 100×100,定义 101 101 101很够用了。
第6~9行: 全都是输入,没啥好讲的,但是编程初学者还是多读读,熟悉熟悉语言。
第10~12行: 输入进来了小A的原版的画,但是为啥我单独将,因为这里的数组的行和列我都是从1开始的,大家都知道,数组一般是从零开始存的。因为题上的第几行,第几列都是从1开始数的:最开始的那一行或者那一列表示为 1 1 1,而不是 0 0 0,后面裁剪的坐标也是按照这个,为了后面的读取方便,我也按照题上的方式从 1 1 1存了。当然有很多人有从 1 1 1存的习惯,平常都是这样写的,比如我。
第13~20行: 这一段的想法很巧妙,我直接循环裁剪的坐标,把裁剪后的那一段直接输出了,但是一定很多同学也是这样写的。因为题上说的是从第几行到第几行,所以循环 i i i从 x 1 x1 x1到 x 2 x2 x2,因为 x 1 , x 2 x1,x2 x1,x2那两行也在裁剪后的画中,所以是从 x 1 < = x 2 x1<=x2 x1<=x2,列同理。
第15~18行: 这是输出细节,为啥我要写if-else呢?因为输出时,每一行的结尾要换行,如何判断该不该换行呢? j j j代表列,它一次循环循环到了最后,就是 j = y 2 j=y2 j=y2时,这一行就已经输出完了,需加回车;其他情况不需要。这里理解费尽的同学一定要再学学双循环和二维数组,具体的细节咋这里我就不占开讲了。
总结
这道题非常简单,前提是你要学好学透双循环和二维数组,否则一点细节你就能蒙。
今天就讲到这里,拜拜,希望你点个赞哦!
更多推荐



所有评论(0)