绘制二维矩阵的行和列

Posted

技术标签:

【中文标题】绘制二维矩阵的行和列【英文标题】:Painting rows and columns of a 2D matrix 【发布时间】:2020-06-16 10:07:32 【问题描述】:

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

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

    用颜色 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;
    

【问题讨论】:

为什么用两个绘制操作来划分循环?这是展开的廉价尝试吗? 如果您是 C++ 新手,我建议您阅读:Why using namespace std is considered bad practise,这很有趣! 【参考方案1】:

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

然后,对于给定的元素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";
    

【讨论】:

很好的解决方案!【参考方案2】:

您可以:

    在解析输入时,保持并更新:

    对于每一行,最后一个颜色 ai 应该被涂上,对应的值 k(从 0 到 K) 每列都一样

    设置一个绘制操作数组,为发生绘制的所有行和列组合行和列绘制

    根据k对数组进行排序 对初始化为 0 的矩阵执行这些操作

如果存在较大的k(因此,大量的重绘),您可以从这类问题中获得该算法的优势。

【讨论】:

以上是关于绘制二维矩阵的行和列的主要内容,如果未能解决你的问题,请参考以下文章

根据行和列对矩阵中的所有元素进行排名

从 Java 中的二维数组矩阵中获取行和列

二维数组3:搜索二维矩阵

打印 2 个数组的行和列的总和

寻找二维数组中唯一的行和列的索引,以及这些位置上元素的最小和。

LeetCode73. 矩阵置零