hi,我是小汉堡,今天我们讲一道程序题,是GESP的真题,如果还没找到前面的小题的解析,可以来看这一篇2025年6月GESP四级真题解析(免费)


题目链接

洛谷链接
hydro链接


题目

题目描述

小 A 在高为 h h h 宽为 w w w 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为 h h h w w w 列的字符矩阵,其中的字符均为 ASCII 码位于 33 ∼ 126 33 \sim 126 33126 之间的可见字符,小 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 x2x1+1 行,每行一个长度为 y 2 − y 1 + 1 y_2 - y_1 + 1 y2y1+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 1h,w100 1 ≤ x 1 ≤ x 2 ≤ h 1 \leq x_1 \leq x_2 \leq h 1x1x2h 1 ≤ y 1 ≤ y 2 ≤ w 1 \leq y_1 \leq y_2 \leq w 1y1y2w


题目解释

读懂的略过
这道题的意思就是,要把一个小盆友画的画进行裁剪,裁剪的坐标已经告诉了我们,我们只需要把裁剪的坐标进行输出就好了

样例解释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 1h,w100,这说明小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时,这一行就已经输出完了,需加回车;其他情况不需要。这里理解费尽的同学一定要再学学双循环和二维数组,具体的细节咋这里我就不占开讲了。


总结

这道题非常简单,前提是你要学好学透双循环和二维数组,否则一点细节你就能蒙。

今天就讲到这里,拜拜,希望你点个赞哦!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐