【CSP201512-3】画图【模拟&bfs/dfs】

题意:

画布宽度为m,高度为n,以字符为单位,左下角坐标为(0,0),向右为x坐标增大的方向,向上为y坐标增大的方向。
现有两种操作:画线0 x1 y1 x2 y2,其中(x1,y1)和(x2,y2)分别是线段的两端,水平线段用’-‘来画,竖直线段用字符’|‘来画,若水平与竖直线相交,则用’+‘来画。题目保证线段都是水平或者竖直的。
填充1 x y c,其中(x,y)是起始位置,保证不会落在任何已有的线段上;要从起始位置开始用字符c填充位置,直到遇到画布边缘或已经画好的线段。注意相邻位置只需要考虑上下左右四个方向。
操作一共有q个,按照数据给出的顺序依次执行。画布最初时所有位置都是字符小数点’.’。要求输出最后得到的画图结果。


思路:

首先要创建画布map[100][100],此时应注意画布相对于题目的坐标系画布有所旋转。将map初始化为小数点.。
画线操作:判断线段是水平(y相同)还是竖直(x相同)的。比如线段是水平的,此时要判断x坐标,将小的放在x1,大的放在x2。然后从(x1,y1)到(x2,y1)依次判断,如果是’|’,把它变成’+’;如果是’+’,不变;不然就变为’-’。
填充操作:使用bfs或者dfs都可以。可以不用开标记数组,只要画布map当前位置变为字符c则可以判断已经标记。
最后的输出要注意画布方向,应从y=n-1~0, x=0~m-1进行输出。


总结:

一道CSP历年真题,思路很是简单,但要一次拿到100分还是很难的。题目有很多坑,比如画布的旋转,输出的顺序;画线时两个点可能坐标大的在前,小的在后,应交换;画线时可能只判断’-‘应变成’+‘而不是’|’,而没注意’+'要保持不变等等。做完题后一定要好好检查,防止爆零或者能拿100却拿一部分分。


代码:

#include <iostream>
#include <queue>
using namespace std;

int m,n,q;
char map[100][100];	//注意画布旋转
int dx[4]= {
   0,1,0,-1},dy[4]= {
   1,0,-1,0};	//上右下左
void swap(int &x,int &y)
{
   
	int t=x;
	x=y;
	y=t;
}
struct point
{
   
	int x,y;
	point(int x1,int y1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值