洛谷 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++特性,提高代码的安全性和可读性。

【算法代码】

cpp 复制代码
#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

相关推荐
网域小星球1 个月前
C语言从0入门(十)|二维数组详解与矩阵实战
c语言·算法·矩阵·二维数组·数组遍历
汉克老师2 个月前
GESP2026年3月认证C++二级( 第三部分编程题(2)画画 )
c++·二维数组·gesp二级·gesp2级·打印图形
编程火箭车4 个月前
【Java SE 基础学习打卡】37 二维数组
二维数组·数组遍历·java se·java 基础·二维数组初始化·不规则二维数组·表格型数据存储
皮皮哎哟4 个月前
冒泡排序与数组传递全解析 一维二维指针数组及二级指针应用指南
c语言·算法·冒泡排序·二维数组·指针数组·传参·二级指针
汉克老师4 个月前
GESP2025年9月认证C++二级真题与解析(编程题2(菱形))
c++·找规律·二维数组·枚举算法·曼哈顿距离·模拟画图
汉克老师5 个月前
GESP2025年12月认证C++二级真题与解析(编程题2 (黄金格))
c++·二维数组·gesp二级·gesp2级·分支判断
一雨方知深秋5 个月前
数组定义及访问
java·数组·二维数组·for·length·定义访问
爱学习的小鱼gogo7 个月前
pyhton 螺旋矩阵(指针-矩阵-中等)含源码(二十六)
python·算法·矩阵·指针·经验·二维数组·逆序
課代表7 个月前
JavaScript 二维数组的三种定义与初始化方法
javascript·初始化·二维数组·多维数组·动态数组·循环遍历·数组合并