文章

【GESP】C++四级真题 luogu-B4360 [GESP202506 四级] 画布裁剪

GESP C++四级2025年6月真题。本题主要考查二维数组的应用。属于四级题中的简单题。难度⭐⭐☆☆☆。本题在洛谷评定为入门

luogu-B4360 [GESP202506 四级] 画布裁剪

题目要求

题目描述

小 A 在高为 $h$ 宽为 $w$ 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为 $h$ 行 $w$ 列的字符矩阵,其中的字符均为 ASCII 码位于 $33 \sim 126$ 之间的可见字符,小 A 只保留画布中由第 $x_1$ 行到第 $x_2$ 行、第 $y_1$ 列到第 $y_2$ 列构成的子矩阵。

小 A 将画布交给了你,你能帮他完成画布的裁剪吗?

输入格式

第一行,两个正整数 $h, w$,分别表示画布的行数与列数。

第二行,四个正整数 $x_1, x_2, y_1, y_2$,表示保留的行列边界。

接下来 $h$ 行,每行一个长度为 $w$ 的字符串,表示画布内容。

输出格式

输出共 $x_2 - x_1 + 1$ 行,每行一个长度为 $y_2 - y_1 + 1$ 的字符串,表示裁剪后的画布。

输入输出样例 #1

输入 #1
1
2
3
4
5
3 5
2 2 2 4
.....
.>_<.
.....
输出 #1
1
>_<

输入输出样例 #2

输入 #2
1
2
3
4
5
6
7
5 5
1 2 3 4
AbCdE
fGhIk
LmNoP
qRsTu
VwXyZ
输出 #2
1
2
Cd
hI

说明/提示

对于所有测试点,保证 $1 \leq h, w \leq 100$,$1 \leq x_1 \leq x_2 \leq h$,$1 \leq y_1 \leq y_2 \leq w$。


题目分析

本题是一道简单的二维数组操作题目。主要考察对字符矩阵的截取操作。

1. 数据结构设计

  • 使用字符串数组str_ary[105]存储输入的画布内容
  • 数组大小设置为105是为了满足题目要求的最大范围($h,w \leq 100$),并留有余量

2. 核心算法思路

  • 首先读入画布的高度h和宽度w
  • 读入需要保留的区域范围:行($x_1$ 到 $x_2$)和列($y_1$ 到 $y_2$)
  • 读入整个画布内容,每行存储为一个字符串
  • 按照指定范围输出子矩阵:
    • 外层循环遍历行:从$x_1$到$x_2$
    • 内层循环遍历列:从$y_1$到$y_2$
    • 注意字符串下标从0开始,输出时需要将列坐标减1

3. 算法复杂度分析

  1. 时间复杂度
    • 读入画布内容:$O(h \times w)$
    • 输出裁剪区域:$O((x_2-x_1+1) \times (y_2-y_1+1))$
    • 总体时间复杂度:$O(h \times w)$
  2. 空间复杂度
    • 存储画布内容:$O(h \times w)$
    • 其他变量:$O(1)$
    • 总体空间复杂度:$O(h \times w)$


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>

// 定义字符串数组存储画布内容,最大支持105行
std::string str_ary[105];

int main() {
    // 声明画布的高度和宽度变量
    int h, w;
    std::cin >> h >> w;
    
    // 声明裁剪区域的行列范围变量
    int x1, x2, y1, y2;
    std::cin >> x1 >> x2 >> y1 >> y2;

    // 读入画布内容,每行一个字符串
    for (int i = 1; i <= h; i++) {
        std::cin >> str_ary[i];
    }

    // 输出裁剪后的画布内容
    // 外层循环遍历选定的行范围
    for (int i = x1; i <= x2; i++) {
        // 内层循环遍历选定的列范围
        for (int j = y1; j <= y2; j++) {
            // 注意:由于字符串下标从0开始,所以这里需要j-1
            std::cout << str_ary[i][j - 1];
        }
        // 每输出完一行后换行
        std::cout << "\n";
    }
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权