画布与印章C++

画布与印章


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值