【题目来源】
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。
【算法分析】
代码实现了一个简单的矩阵区域提取功能。虽然写法传统,但清晰地展示了:
- 二维数组的定义和使用
- 双重循环遍历矩阵
- 指定区域的提取和输出
对于初学者来说,这种写法有助于理解二维数组的基本操作。在实际项目中,建议使用 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