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

问题:我们给出了一个 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;
    }
}

【问题讨论】:

标签: c++


【解决方案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】:

您可以:

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

    • 对于每一行,最后一个颜色 ai 应该被涂上,对应的值 k(从 0 到 K)
    • 每列都一样
  2. 设置一个绘制操作数组,为发生绘制的所有行和列组合行和列绘制

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2020-10-22
    • 2021-04-04
    相关资源
    最近更新 更多