传送门
题目描述
欣君在粉刷一面墙,他对墙的粉刷并不是规矩的逐行粉刷或者逐列粉刷,而是漫无目的地随机刷一行或者刷一列,他相信经过这种奇妙的涂刷之后墙面会变得独特而美丽,每次给一整行或者一整列的格子刷上一种颜色后,颜色会覆盖之前刷的颜色,问最后每个格子的颜色。初始所有格子的颜色都为 0 。
输入
第一行 n,m,k 表示墙的长宽和粉刷的次数
接下来k行每行包括三个数字p,l,c,分别表示刷墙的方式,刷墙的位置和刷墙用的颜色,p=1表示把第l行墙刷成c颜色,p=2表示把第l列墙刷成c颜色
输出
每一小块墙的颜色(格式参考样例)
样例输入
3 3 3
1 1 3
2 2 1
1 2 2
样例输出
3 1 3
2 2 2
0 1 0
提示
【样例说明】
首先把第一行刷成颜色3
然后把第二列刷成颜色1
最后把第二行刷成颜色2
【数据范围】
对于10%的数据1 ≤ n , m≤10 ,1 ≤ k ≤ 10;
对于30%的数据1 ≤ n , m≤1000 ,1 ≤ k ≤ 1000;
对于100%的数据 1 ≤ n , m≤ 2000, 1 ≤ k ≤ 100000
题解:
看到题目,我们发现这题好像没什么算法。于是乎,便有了第一份 错误 代码。
#include<bits/stdc++.h>
using namespace std;
int n,m,k,x,y,z;
int a[2010][2010];
int main()
{
int i,j;
cin>>n>>m>>k;
memset(a,0,sizeof(a));
for(i=1;i<=k;i++)
{
cin>>x>>y>>z;
if(x==1)
{
for(j=1;j<=m;j++)
a[y][j]=z;
}
else
{
for(j=1;j<=n;j++)
a[j][y]=z;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
意思很简单,无非是按题目意思打下来。
很快,判题机给了我一个让我满意的答案
啊,这,果然。。。
仔细一看,发现数据大小有些不对劲
对于100%的数据 1 ≤ n , m≤ 2000, 1 ≤ k ≤ 100000
看来所有数据都跑一边是炸了。
一拍脑瓜,发现无论颜色咋么覆盖,留下的永远是最上面的一层,那我从后往前不就好了,嘿嘿嘿
马上出现了第二份 错误 代码
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int x[2010],y[2010],z[2010];
int a[2010][2010];
int main()
{
int i,j;
cin>>n>>m>>k;
memset(a,0,sizeof(a));
for(i=1;i<=k;i++)
cin>>x[i]>>y[i]>>z[i];
for(i=k;i>=1;i--)
{
if(x[i]==1)
{
for(j=1;j<=m;j++)
if(a[y[i]][j]==0)
a[y[i]][j]=z[i];
}
else
{
for(j=1;j<=n;j++)
if(a[j][y[i]]==0)
a[j][y[i]]=z[i];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
然后:
????????
心态发生了一丝变化,开始放弃
时间过得飞快,到了结束前2分钟,我又一拍脑瓜 坏掉了,发现题目有猫腻
欣君在粉刷一面墙,他对墙的粉刷并不是规矩的逐行粉刷或者逐列粉刷,而是漫无目的地随机刷一行或者刷一列,他相信经过这种奇妙的涂刷之后墙面会变得独特而美丽,每次给一整行或者一整列的格子刷上一种颜色后,颜色会覆盖之前刷的颜色,问最后每个格子的颜色。初始所有格子的颜色都为 0
马萨卡?可以把墙刷成“0”这个颜色?
赶在最后1s面前,改好代码,上交
#include<bits/stdc++.h>
using namespace std;
int n,m,k,flag;
int x[2010],y[2010],z[2010];
int a[2010][2010];
int main()
{
int i,j;
cin>>n>>m>>k;
memset(a,-1,sizeof(a));
flag=0;
for(i=1;i<=k;i++)
cin>>x[i]>>y[i]>>z[i];
for(i=k;i>=1;i--)
{
if(x[i]==1&&a[y[i]][0]!=1)
{
flag++;
a[y[i]][0]=1;
for(j=1;j<=m;j++)
if(a[y[i]][j]==-1)
a[y[i]][j]=z[i];
}
else
if(x[i]==2&&a[0][y[i]]!=1)
{
flag++;
a[0][y[i]]=1;
for(j=1;j<=n;j++)
if(a[j][y[i]]==-1)
a[j][y[i]]=z[i];
}
if(flag==n*m) break;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
if(a[i][j]==-1) cout<<"0 ";
else cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
当大家已经结束比赛开始聊天时,我还盯着未判定的代码
然后
奶思!
长舒一口气然后想对出题老师说一句: