刷墙工

传送门
题目描述
欣君在粉刷一面墙,他对墙的粉刷并不是规矩的逐行粉刷或者逐列粉刷,而是漫无目的地随机刷一行或者刷一列,他相信经过这种奇妙的涂刷之后墙面会变得独特而美丽,每次给一整行或者一整列的格子刷上一种颜色后,颜色会覆盖之前刷的颜色,问最后每个格子的颜色。初始所有格子的颜色都为 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;
}

当大家已经结束比赛开始聊天时,我还盯着未判定的代码
然后
在这里插入图片描述
奶思!
长舒一口气然后想对出题老师说一句:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值