问题:我们给了一个nxm矩阵,最初用0初始化。我们必须执行k个查询:
每个查询都支持两个操作之一。
同一元素可以绘制一次以上。但是该元素的颜色与该元素最后绘制的颜色相同。绘画后必须打印最终矩阵。
输入:第一行包含三个以空格分隔的整数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 0 0
我已经写了下面的代码来解决它,但是它显示了一些测试用例的标题。您能给我一些如何有效解决的想法吗?
我的密码
#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++ - 绘制2D矩阵的行和列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62405998/