画布与印章
Jim有一个很大的画布,还有一个小印章,印章的图案由下图所示。
BQQRQMRgRgMgMgRQQQBBBBBBBBBBBBBBBBBBBBBB
QQMQMRMMgQMBBBBQgdsvr7rr7jL77LvsuSXPZQBB
BMRgRgRMQggKLi: ...:i75XJ. ... .g
QRgMggddq2Jsr7riYQdYri7YUPEi .::.. 5BB
QMMgMZJPgEgP55ZPIPdX27::iivM: i:::::PBBM
RRgggDZBQK5KbQRQdbZQDB5.:ii7L ... 7BBRDQ
QgMgMPjIv7PZDEZEZdEPDgBi.iiir ...sBQgDMM
gRgMgg7.jggEdEbZddPddgBr iir....PBgDZggR
RgMDgMZYPZEbEdEbdPddZgB..ii. 1BggEgZgg
gRggZggREDdEbEbdPdbEEBP ir. UBDZZDZggM
RgMDgEgEDEDdEbEbdbZZBB:.: .PBQZdgEgDMg
gMggDDZDdDEZEDdDZggBB: . :BB5dbDZgZggR
MDgDgDgZDEZEZEDZMRBB. ..igBPISEZDZgggg
MMggZDEgZZdDEggRgQI :PPgggZgZgEgZgDR
QMgggZDEZdDZgMQRX. .uQBQDDEDZZEDDgDQM
QQMMDgZgZDZggQEi iEQBPPPDEDdZEgDggQMQ
QRQMQgMgMMBQE: :IgQRPPDEbEgDgggDRRQQQQ
QQQQQQQBBBX: :IZBBQggDDEggMgMMQRRRQQBQB
BQBQBBQK7..iPBBQBMRgMgMggDRMQMQQBQBQBQBB
BBQBRXJUqBBBBBBBQQQQRQQQQQQBQBBBBBQBBBBB
为20×40的印章,印章大小固定。现在Jim要在画布上按好几次印章,印章图案可以重叠,印章中的空格代表该单位为空,也就意味着印章在空格的地方印不上颜色。初始画布为空白,也就是全是空格。
输入描述
输入三个数字n,m,q,分别代表画布的边长和印印章的次数。
接下来q行,每行两个整数x,y代表印章左上角的坐标,画布左上角坐标
输出描述
输出整个画布最后的图像
样例输入 1
20 40 2
0 0
9 9
样例输出 1
BQQRQMRgRgMgMgRQQQBBBBBBBBBBBBBBBBBBBBBB
QQMQMRMMgQMBBBBQgdsvr7rr7jL77LvsuSXPZQBB
BMRgRgRMQggKLi: ...:i75XJ. ... .g
QRgMggddq2Jsr7riYQdYri7YUPEi .::.. 5BB
QMMgMZJPgEgP55ZPIPdX27::iivM: i:::::PBBM
RRgggDZBQK5KbQRQdbZQDB5.:ii7L ... 7BBRDQ
QgMgMPjIv7PZDEZEZdEPDgBi.iiir ...sBQgDMM
gRgMgg7.jggEdEbZddPddgBr iir....PBgDZggR
RgMDgMZYPZEbEdEbdPddZgB..ii. 1BggEgZgg
gRggZggREBQQRQMRgRgMgMgRQQQBBBBBBBBBBBBB
RgMDgEgEDQQMQMRMMgQMBBBBQgdsvr7rr7jL77Lv
gMggDDZDdBMRgRgRMQggKLi: ...:i75XJ.gZ...
MDgDgDgZDQRgMggddq2Jsr7riYQdYri7YUPEig.:
MMggZDEgZQMMgMZJPgEgP55ZPIPdX27::iivM:Di
QMgggZDEZRRgggDZBQK5KbQRQdbZQDB5.:ii7LQ.
QQMMDgZgZQgMgMPjIv7PZDEZEZdEPDgBi.iiirM.
QRQMQgMgMgRgMgg7.jggEdEbZddPddgBrDiir...
QQQQQQQBBRgMDgMZYPZEbEdEbdPddZgB..ii.BQB
BQBQBBQK7gRggZggREDdEbEbdPdbEEBPBir.BQBU
BBQBRXJUqRgMDgEgEDEDdEbEbdbZZBB:.:QBB.PB
说明
n,m ≤ 2000,q ≤ 100
0 ≤ x < n , 0 ≤ y < m
#include <iostream>
#include <vector>
#include <string>
using namespace std;
包含头文件:
#include :这是C++标准库的输入输出流头文件,用于读取输入和输出结果。
#include :这个头文件用于使用C++标准库中的向量(动态数组)容器。
#include :这个头文件提供了字符串类的定义和相关操作。
命名空间:
using namespace std;:使用了std命名空间,这样就可以直接使用cout、cin、vector等标准库中的元素,而无需每次都加上 std:: 前缀。
int main() {
int n, m, q;
cin >> n >> m >> q;
主函数:
int main() { … }:这是C++程序的入口函数。
输入画布尺寸和操作数:
int n, m, q;:声明了三个整数变量 n、m 和 q,分别表示画布的行数、列数以及操作数。
cin >> n >> m >> q;:从标准输入(通常是键盘输入)读取三个整数,分别赋值给 n、m 和 q。
cpp
// 初始化画布,全部填充为空格
vector<vector> canvas(n, vector(m, ’ '));
初始化画布:
vector<vector> canvas(n, vector(m, ’ '));:创建了一个二维向量 canvas,大小为 n 行 m 列,每个元素初始化为 ’ ',即空格字符。这个二维向量表示我们的画布,每个位置可以存储一个字符。
for (int k = 0; k < q; ++k) {
int x, y;
cin >> x >> y;
处理每个操作:
for (int k = 0; k < q; ++k) { … }:循环 q 次,每次处理一个操作。
int x, y;:声明两个整数变量 x 和 y,用于存储操作的位置信息。
cin >> x >> y;:从输入读取两个整数,分别赋值给 x 和 y,这表示印章要放置的起始位置。
// 定义印章的图案
vector<string> stamp = {
"BQQRQMRgRgMgMgRQQQBBBBBBBBBBBBBBBBBBBBBB",
"QQMQMRMMgQMBBBBQgdsvr7rr7jL77LvsuSXPZQBB",
"BMRgRgRMQggKLi: ...:i75XJ. ... .g",
"QRgMggddq2Jsr7riYQdYri7YUPEi .::.. 5BB",
"QMMgMZJPgEgP55ZPIPdX27::iivM: i:::::PBBM",
"RRgggDZBQK5KbQRQdbZQDB5.:ii7L ... 7BBRDQ",
"QgMgMPjIv7PZDEZEZdEPDgBi.iiir ...sBQgDMM",
"gRgMgg7.jggEdEbZddPddgBr iir....PBgDZggR",
"RgMDgMZYPZEbEdEbdPddZgB..ii. 1BggEgZgg",
"gRggZggREDdEbEbdPdbEEBP ir. UBDZZDZggM",
"RgMDgEgEDEDdEbEbdbZZBB:.: .PBQZdgEgDMg",
"gMggDDZDdDEZEDdDZggBB: . :BB5dbDZgZggR",
"MDgDgDgZDEZEZEDZMRBB. ..igBPISEZDZgggg",
"MMggZDEgZZdDEggRgQI :PPgggZgZgEgZgDR",
"QMgggZDEZdDZgMQRX. .uQBQDDEDZZEDDgDQM",
"QQMMDgZgZDZggQEi iEQBPPPDEDdZEgDggQMQ",
"QRQMQgMgMMBQE: :IgQRPPDEbEgDgggDRRQQQQ",
"QQQQQQQBBBX: :IZBBQggDDEggMgMMQRRRQQBQB",
"BQBQBBQK7..iPBBQBMRgMgMggDRMQMQQBQBQBQBB",
"BBQBRXJUqBBBBBBBQQQQRQQQQQQBQBBBBBQBBBBB"
};
定义印章图案:
vector stamp = { … };:定义了一个字符串向量 stamp,里面包含了一个20行40列的印章图案。每个字符串代表图案的一行。
// 将印章应用到画布上
for (int i = 0; i < 20; ++i) {
for (int j = 0; j < 40; ++j) {
if (stamp[i][j] != ' ') {
if (x + i < n && y + j < m) {
canvas[x + i][y + j] = stamp[i][j];
}
}
}
}
}
应用印章到画布:
嵌套循环 for (int i = 0; i < 20; ++i) 和 for (int j = 0; j < 40; ++j) 遍历印章的每个像素。
if (stamp[i][j] != ’ '):如果印章在当前位置不是空格(即有颜色)。
if (x + i < n && y + j < m):检查印章是否超出了画布的边界。
canvas[x + i][y + j] = stamp[i][j];:将印章的颜色应用到画布的对应位置上。
// 输出最终的画布状态
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cout << canvas[i][j];
}
cout << endl;
}
return 0;
}
输出最终画布状态:
嵌套循环 for (int i = 0; i < n; ++i) 和 for (int j = 0; j < m; ++j) 遍历画布的每个位置。
cout << canvas[i][j];:输出画布上每个位置的字符。
cout << endl;:在每行末尾输出换行符,确保每一行都单独占据一行输出。
程序结束:
return 0;
主函数结束,返回0表示程序成功执行。
代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
int n, m, q;
cin >> n >> m >> q;
// 初始化画布,全部填充为空格
vector<vector<char>> canvas(n, vector<char>(m, ' '));
for (int k = 0; k < q; ++k) {
int x, y;
cin >> x >> y;
// 定义印章的图案
vector<string> stamp = {
"BQQRQMRgRgMgMgRQQQBBBBBBBBBBBBBBBBBBBBBB",
"QQMQMRMMgQMBBBBQgdsvr7rr7jL77LvsuSXPZQBB",
"BMRgRgRMQggKLi: ...:i75XJ. ... .g",
"QRgMggddq2Jsr7riYQdYri7YUPEi .::.. 5BB",
"QMMgMZJPgEgP55ZPIPdX27::iivM: i:::::PBBM",
"RRgggDZBQK5KbQRQdbZQDB5.:ii7L ... 7BBRDQ",
"QgMgMPjIv7PZDEZEZdEPDgBi.iiir ...sBQgDMM",
"gRgMgg7.jggEdEbZddPddgBr iir....PBgDZggR",
"RgMDgMZYPZEbEdEbdPddZgB..ii. 1BggEgZgg",
"gRggZggREDdEbEbdPdbEEBP ir. UBDZZDZggM",
"RgMDgEgEDEDdEbEbdbZZBB:.: .PBQZdgEgDMg",
"gMggDDZDdDEZEDdDZggBB: . :BB5dbDZgZggR",
"MDgDgDgZDEZEZEDZMRBB. ..igBPISEZDZgggg",
"MMggZDEgZZdDEggRgQI :PPgggZgZgEgZgDR",
"QMgggZDEZdDZgMQRX. .uQBQDDEDZZEDDgDQM",
"QQMMDgZgZDZggQEi iEQBPPPDEDdZEgDggQMQ",
"QRQMQgMgMMBQE: :IgQRPPDEbEgDgggDRRQQQQ",
"QQQQQQQBBBX: :IZBBQggDDEggMgMMQRRRQQBQB",
"BQBQBBQK7..iPBBQBMRgMgMggDRMQMQQBQBQBQBB",
"BBQBRXJUqBBBBBBBQQQQRQQQQQQBQBBBBBQBBBBB"
};
// 将印章应用到画布上
for (int i = 0; i < 20; ++i) {
for (int j = 0; j < 40; ++j) {
if (stamp[i][j] != ' ') {
if (x + i < n && y + j < m) {
canvas[x + i][y + j] = stamp[i][j];
}
}
}
}
}
// 输出最终的画布状态
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cout << canvas[i][j];
}
cout << endl;
}
return 0;
}