✏️ 纠错
第 130 题 / 共 155 题
题目描述
小 A 在高为 h 宽为 w 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为 h 行 w 列的字符矩阵,其中的字符均为 ASCII 码位于 33∼126 之间的可见字符,小 A 只保留画布中由第 x1 行到第 x2 行、第 y1 列到第 y2 列构成的子矩阵。
小 A 将画布交给了你,你能帮他完成画布的裁剪吗?
输入格式
第一行,两个正整数 h,w,分别表示画布的行数与列数。
第二行,四个正整数 x1,x2,y1,y2,表示保留的行列边界。
接下来 h 行,每行一个长度为 w 的字符串,表示画布内容。
输出格式
输出共 x2−x1+1 行,每行一个长度为 y2−y1+1 的字符串,表示裁剪后的画布。
输入输出样例
输入 #1
3 5 2 2 2 4 ..... .>_<. .....
输出 #1
>_<
输入 #2
5 5 1 2 3 4 AbCdE fGhIk LmNoP qRsTu VwXyZ
输出 #2
Cd hI
说明/提示
对于所有测试点,保证 1≤h,w≤100,1≤x1≤x2≤h,1≤y1≤y2≤w。
你真棒!
📝 题目解析
【解题思路】
本题的主要思路是读取画布的信息,然后根据给定的行列边界裁剪画布并输出。
首先,使用scanf读取画布的行数n和列数m,以及裁剪的行列边界x1, x2, y1, y2。
接着,使用scanf读取画布的每一行内容,存储在二维字符数组s中。
最后,遍历需要保留的行,将每行中超出裁剪列边界的字符置为字符串结束符'\0',然后输出从y1列开始的字符串。
参考程序
#include <cstdio>
using namespace std;
const int N = 105;
int n, m;
char s[N][N];
int x1, x2, y1, y2;
int main() {
scanf("%d%d", &n, &m);
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
for (int i = 1; i <= n; i++)
scanf("%s", s[i] + 1);
for (int i = x1; i <= x2; i++) {
s[i][y2 + 1] = 0;
printf("%s\n", s[i] + y1);
}
return 0;
}