题解:洛谷 B4360 [GESP202506 四级] 画布裁剪
附上汇总帖:GESP认证C++编程真题解析 | 汇总
【题目来源】
洛谷:B4360 [GESP202506 四级] 画布裁剪 - 洛谷
【题目描述】
小 A 在高为h hh宽为w ww的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为h hh行w ww列的字符矩阵,其中的字符均为 ASCII 码位于33 ∼ 126 33∼12633∼126之间的可见字符,小 A 只保留画布中由第x 1 x_1x1行到第x 2 x_2x2行、第y 1 y_1y1列到第y 2 y_2y2列构成的子矩阵。
小 A 将画布交给了你,你能帮他完成画布的裁剪吗?
【输入】
第一行,两个正整数h , w h,wh,w,分别表示画布的行数与列数。
第二行,四个正整数x 1 , x 2 , y 1 , y 2 x_1,x_2,y_1,y_2x1,x2,y1,y2,表示保留的行列边界。
接下来h hh行,每行一个长度为w ww的字符串,表示画布内容。
【输出】
输出共x 2 − x 1 + 1 x_2−x_1+1x2−x1+1行,每行一个长度为y 2 − y 1 + 1 y_2−y_1+1y2−y1+1的字符串,表示裁剪后的画布。
【输入样例】
3 5 2 2 2 4 ..... .>_<. .....【输出样例】
>_<【核心思想】
问题分析:给定一个h × w h \times wh×w的字符矩阵,需要输出由第x 1 x_1x1行到第x 2 x_2x2行、第y 1 y_1y1列到第y 2 y_2y2列构成的子矩阵。这是一个矩阵子区域提取问题,核心在于正确读取输入并按指定行列范围输出。
算法选择:
- 二维数组存储:将画布内容存入二维字符数组
- 范围遍历输出:按指定行列边界遍历并输出对应字符
关键步骤:
- 读入数据:读取h , w h, wh,w和裁剪边界x 1 , x 2 , y 1 , y 2 x_1, x_2, y_1, y_2x1,x2,y1,y2
- 读取画布:遍历i ii从1 11到h hh,j jj从1 11到w ww,读入a [ i ] [ j ] a[i][j]a[i][j]
- 输出子矩阵(i ii从x 1 x_1x1到x 2 x_2x2):
- j jj从y 1 y_1y1到y 2 y_2y2:输出a [ i ] [ j ] a[i][j]a[i][j]
- 每行结束后输出换行
时间/空间复杂度:
- 时间复杂度:O ( h ⋅ w ) O(h \cdot w)O(h⋅w),读取整个画布并输出子区域
- 空间复杂度:O ( h ⋅ w ) O(h \cdot w)O(h⋅w),存储完整画布
矩阵子区域提取的核心思想:
- 坐标映射:输入的行列坐标直接对应数组下标,无需复杂转换,按给定范围直接遍历即可
- 逐行输出:外层循环控制行,内层循环控制列,每行结束后换行,保持矩阵的二维结构
- 边界安全性:题目保证输入边界合法,无需额外的越界检查
- 适用于基础矩阵操作、子区域提取类入门问题
【算法标签】
#入门 #字符串入门
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;constintN=105;// 定义网格最大尺寸inth,w;// 网格的行数和列数chara[N][N];// 存储网格字符的二维数组intx1,x2,y1,y2;// 定义要输出的子网格范围intmain(){// 输入网格的行数和列数cin>>h>>w;// 输入要输出的子网格范围(左上角和右下角坐标)cin>>x1>>x2>>y1>>y2;// 输入网格数据for(inti=1;i<=h;i++)for(intj=1;j<=w;j++)cin>>a[i][j];// 输出指定子网格范围内的内容for(inti=x1;i<=x2;i++){for(intj=y1;j<=y2;j++)cout<<a[i][j];// 输出当前字符cout<<endl;// 每行结束后换行}return0;}【运行结果】
3 5 2 2 2 4 ..... .>_<. ..... > _ <