c++ - 绘制二维矩阵的行和列

标签 c++

问题:我们给定了一个 nxm 矩阵,最初初始化为 0。我们必须执行 k 次查询: 每个查询支持两种操作之一。

  1. 用颜色 ai 绘制 ri 行中的所有元素。

  2. 用颜色 ai 绘制 ci 列中的所有元素。

    同一个元素可以多次绘制。但该元素的颜色与该元素最后绘制的颜色相同。绘制后必须打印最终的矩阵。

输入:第一行包含三个空格分隔的整数 N,M,K
接下来的 K 行恰好包含要执行的一种类型的操作
1) 1 ri ai 表示 ri 行涂有颜色 ai
2) 2 ci ai 表示 ci 列涂有颜色 ai

输出:打印绘制后大小为nxm的最终矩阵。

输入示例:
3 3 3
1 1 3
2 2 1
1 2 2

输出:
3 1 3
2 2 2
0 1 0


我编写了以下代码来解决它,但它显示了一些测试用例的 TLE。您能给我一些如何有效解决这个问题的想法吗?
我的代码

#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int mat[5000][5000];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m,k,q,r,c,val,i,j,re;
    cin>>n>>m>>re;
    while(re--)
    {
        cin>>q;
        if(q==1)
        {
            cin>>r;
            cin>>val;
            i=r-1;
            for(j=0,k=m-1;j<=k;j++,k--)
            {
                mat[i][j]=val;
                mat[i][k]=val;
            }
        }
        else if(q==2)
        {
            cin>>c>>val;
            j=c-1;
            for(i=0,k=n-1;i<=k;i++,k--)
            {
                mat[i][j]=val;
                mat[k][j]=val;

            }
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            cout<<mat[i][j]<<" ";
        }
        cout<<endl;
    }
}

最佳答案

只需记住最后一次影响给定行或给定列的颜色以及最后一次执行的时间即可。

然后,对于给定的元素 mat[i][j],我们只需检查行 i 上的最后一次修改是否发生在最后一次修改之前或之后在j列上。

我们甚至不需要设置这样的矩阵。

#include    <iostream>
#include    <ios>
#include    <vector>

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);

    int n, m, re;
    std::cin >> n >> m >> re;
    std::vector<int> row_color (n, 0), row_date (n, -1);
    std::vector<int> col_color (m, 0), col_date (m, -1);

    int date = 0;
    while (re--) {
        int q, index, val;
        std::cin >> q >> index >> val;
        index--;
        if (q == 1) {
            row_color[index] = val;
            row_date[index] = date;
        } else {
            col_color[index] = val;
            col_date[index] = date;
        }
        ++date;
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            int val = (row_date[i] > col_date[j]) ? row_color[i] : col_color[j];
            std::cout << val << " ";
        }
        std::cout << "\n";
    }
}

关于c++ - 绘制二维矩阵的行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62405998/

相关文章:

c++ - vector 删除不会 "erase"第一个元素

c++ - 如何将枚举传递给模板参数

c++ - 在QWidget的setIcon方法中使用系统图标

c++ - 没有匹配的构造函数来初始化我的自定义分配器

c++ - 为什么SFINAE不适用于这个?

c++ - SDL2不使用纹理绘制图像

c++ - boost odeint : controlled stepper with custom class and vector space algebra

c++ - 查询后未返回任何结果的 MongoDB 套接字异常

c++ - Opencv:从分割的彩色图像中获取所有对象

c++ - boost::read_graphml Visual Studio 2013