✏️ 纠错
第 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;
}