1. 画布裁剪问题解析
1.1 问题背景与需求分析
小画家小A遇到了一个实际的问题:他在一个n行m列的大画布上创作了一幅画作,但画作的实际内容只占据了画布中间的一小部分区域,四周都是空白。这就像我们在白纸上作画时,实际图案可能只占据了纸张中央区域一样。
这个问题需要实现的功能是:给定一个二维字符矩阵表示的画布,以及指定的裁剪范围(x1,y1)到(x2,y2),输出这个范围内的子矩阵。这在实际编程中是一个常见的二维数组操作问题。
1.2 输入输出规范
输入格式要求:
- 第一行两个整数n和m,表示画布的行数和列数
- 接下来n行,每行一个长度为m的字符串,表示画布内容
- 最后一行四个整数x1,x2,y1,y2,表示裁剪范围
输出要求:
- 输出从x1行到x2行,y1列到y2列的子矩阵
- 每行输出完毕后需要换行
例如输入:
code复制5 5
.....
.>_<.
.....
.....
.....
2 3 2 4
应该输出:
code复制>_<
...
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案设计
2.1 数据结构选择
对于这个问题,我们有两种主要的数据存储方式可选:
- 字符数组:
cpp复制char canvas[105][105];
- 字符串数组:
cpp复制string canvas[105];
推荐使用字符串数组,因为:
- 更符合现代C++的编程风格
- 无需担心字符串结束符'\0'的问题
- 可以直接使用cin进行整行输入
数组大小设为105是为了留有缓冲空间,题目中n和m的最大值是100,多出的5个元素可以防止数组越界。
2.2 核心算法实现
裁剪的核心逻辑非常简单,就是双重循环遍历指定范围的元素:
cpp复制for(int i = x1; i <= x2; i++) {
for(int j = y1; j <= y2; j++) {
cout << canvas[i][j];
}
cout << endl;
}
这里需要注意几点:
- 循环边界是闭区间[x1,x2]和[y1,y2]
- 内层循环结束后需要输出换行符
- 行列的遍历顺序不能颠倒
2.3 边界条件处理
在实际编程中,有几个边
