洛谷 B4360:[GESP202506 四级] 画布裁剪 ← 二维字符数组

【题目来源】
https://www.luogu.com.cn/problem/B4360

【题目描述】
小 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 的字符串,表示裁剪后的画布。​​​​​​​

【输入样例】
5 5
1 2 3 4
AbCdE
fGhIk
LmNoP
qRsTu
VwXyZ​​​​​​​

【输出样例】
Cd
hI

【数据范围】
对于所有测试点,保证 1≤h,w≤100,1≤x1≤x2≤h,1≤y1≤y2≤w。

【算法分析】
代码实现了一个简单的矩阵区域提取功能。虽然写法传统,但清晰地展示了:
1. 二维数组的定义和使用
2. 双重循环遍历矩阵
3. 指定区域的提取和输出
对于初学者来说,这种写法有助于理解二维数组的基本操作。在实际项目中,建议使用 vector和 string等现代C++特性,提高代码的安全性和可读性。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int N=105;
char a[N][N];

int main() {
    int h,w;
    int x1,x2,y1,y2;
    cin>>h>>w;
    cin>>x1>>x2>>y1>>y2;

    for(int i=1; i<=h; i++) {
        for(int j=1; j<=w; j++) {
            cin>>a[i][j];
        }
    }

    for(int i=x1; i<=x2; i++) {
        for(int j=y1; j<=y2; j++) {
            cout<<a[i][j];
        }
        cout<<endl;
    }

    return 0;
}

/*
in:
5 5
1 2 3 4
AbCdE
fGhIk
LmNoP
qRsTu
VwXyZ

out:
Cd
hI
*/



【参考文献】
https://gesp.ccf.org.cn/101/attach/1687195991670816.pdf
https://www.luogu.com.cn/problem/solution/B4360
 

posted @ 2026-05-23 00:12  Triwa  阅读(55)  评论(0)    收藏  举报