题解:洛谷 B4360 [GESP202506 四级] 画布裁剪

📅 2026/7/18 22:43:09
题解:洛谷 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_11x2​−x1​1行每行一个长度为y 2 − y 1 1 y_2−y_11y2​−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 hhj 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)存储完整画布矩阵子区域提取的核心思想坐标映射输入的行列坐标直接对应数组下标无需复杂转换按给定范围直接遍历即可逐行输出外层循环控制行内层循环控制列每行结束后换行保持矩阵的二维结构边界安全性题目保证输入边界合法无需额外的越界检查适用于基础矩阵操作、子区域提取类入门问题【算法标签】#入门 #字符串入门【代码详解】#includebits/stdc.husingnamespacestd;constintN105;// 定义网格最大尺寸inth,w;// 网格的行数和列数chara[N][N];// 存储网格字符的二维数组intx1,x2,y1,y2;// 定义要输出的子网格范围intmain(){// 输入网格的行数和列数cinhw;// 输入要输出的子网格范围左上角和右下角坐标cinx1x2y1y2;// 输入网格数据for(inti1;ih;i)for(intj1;jw;j)cina[i][j];// 输出指定子网格范围内的内容for(intix1;ix2;i){for(intjy1;jy2;j)couta[i][j];// 输出当前字符coutendl;// 每行结束后换行}return0;}【运行结果】3 5 2 2 2 4 ..... ._. ..... _