问题描述

  用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。
..____.____..____..____...___..
./.___/.___||.._.\|.._.\./._.\.
|.|...\___.\|.|_).|.|_).|.|.|.|
|.|___.___).|..__/|.._.<|.|_|.|
.\____|____/|_|...|_|.\_\\___/.
  本题要求编程实现一个用 ASCII 字符来画图的程序,支持以下两种操作:
画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来画。如果一条水平线段和一条竖直线段在某个位置相交,则相交位置用字符 + 代替。
填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如下图所示,字符 @ 只和 4 个字符 * 相邻。
.*.
*@*
.*.

输入格式

  第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。
  第2行至第q + 1行,每行是以下两种形式之一:
0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2。
1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
  画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。

输出格式

  输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。

样例输入

4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A

样例输出

AAAA
A--A

样例输入

16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C

样例输出

................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................

评测用例规模与约定

所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100+10;
const int M=100+10;
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
char a[N][M];
int n,m,q;
void dfs(int x,int y,char c) //填充操作
{a[x][y]=c;for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>=m||nx<0||ny>=n||ny<0) continue; //越界 if(a[nx][ny]=='+'||a[nx][ny]=='|'||a[nx][ny]=='-'||a[nx][ny]==c) continue; //碰到线段或者已经填充过 dfs(nx,ny,c);}
}
int main()
{int k,x1,y1,x2,y2;char c;scanf("%d%d%d",&n,&m,&q);memset(a,'.',sizeof(a));while(q--){scanf("%d",&k);if(k) //填充 {scanf("%d%d",&y1,&x1);getchar();c=getchar();dfs(x1,y1,c);}else{scanf("%d%d%d%d",&y1,&x1,&y2,&x2);if(x1==x2) //画横线 {if(y2<y1){int t=y1;y1=y2;y2=t;}for(int i=y1;i<=y2;i++)if(a[x1][i]=='|'||a[x1][i]=='+') a[x1][i]='+'; //遇到交叉画十字 else a[x1][i]='-';}if(y1==y2) //画竖线 {if(x2<x1){int t=x1;x1=x2;x2=t;}for(int i=x1;i<=x2;i++)if(a[i][y1]=='-'||a[i][y1]=='+') a[i][y1]='+'; //遇到交叉画十字 else a[i][y1]='|';}}}for(int i=m-1;i>=0;i--) //输出 {for(int j=0;j<n-1;j++)printf("%c",a[i][j]);printf("%c\n",a[i][n-1]);}return 0;
}

CCF系列题解--2015年12月第三题 ASCII字符画相关推荐

  1. CCF系列题解--2015年3月第三题 节日

    问题描述 有一类节日的日期并不是固定的,而是以"a月的第b个星期c"的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ ...

  2. CCF系列题解--2017年12月第三题 Crontab

    样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * hav ...

  3. CCF系列题解--2016年12月第三题 权限查询

    问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限. 本题中的授权机制是这样设计的:每位用户具有若干角色,每种角色具有若 ...

  4. CCF系列题解--2015年12月第二题 棋类消除

    问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...

  5. CCF系列题解--2013年12月第四题 有趣的数字

    问题描述 我们把一个数称为有趣的,当且仅当:        1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次.        2. 所有的0都出现在所有的1之前,而所有的2都出现 ...

  6. CCF系列题解--2018年3月第三题 URL映射

    问题描述 URL 映射是诸如 Django.Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件.对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 ...

  7. CCF系列题解--2016年9月第四题 交通规划

    问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统. 建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成高速铁路. ...

  8. CCF系列题解--2016年4月第四题 方格游戏

    问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制的角色开始的时候站在第一行第一列,目标是前往第n行第m列. 方格图上有一些方格是始终安全的,有一些在一段时间是危险的,如果小明控 ...

  9. CCF系列题解--2016年9月第二题 火车购票

    问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10 ...

最新文章

  1. 【ACM】 multiset 的 一些应用
  2. 线程中这么调用类_「手撕面试官」谈谈你对JDK中Executor的理解?
  3. 企业级java springboot b2bc商城系统开源源码二次开发-云架构代码结构构建(五)...
  4. mysql 临时列_mysql – 在SQL中添加一个临时列,其中值取决于另一列
  5. 网易云解码实时音视频社交 成就游戏产业发展新变量
  6. EMNLP2018论文解读 | 利用篇章信息提升机器翻译质量
  7. java二维码生成技术
  8. 如何在AS/400上发送带有颜色的MESSAGE
  9. HALCON示例程序sequence_diff.hdev通过两张连续图像进行车辆流量监控
  10. 小程序 mpvue 使用canvas绘制环形图表
  11. [JS] - onmusewheel事件(兼容IE,FF)
  12. charles工具页面介绍
  13. extjs实现组织架构图_如何画好一张架构图?(内含知识图谱)
  14. python求一组数的最大值和平均值_在python中找到一列数据的最小最大值和平均值...
  15. pdf、epub、mobi、三种下载方式区别
  16. redis集群搭建及原理
  17. addClass函数
  18. Ethereum/mist项目下Ethereum Wallet和Mist的区别
  19. css中鼠标手,css各种鼠标手型集合
  20. php 只取汉字,php怎么只保留汉字

热门文章

  1. TGRS2022/遥感:An Empirical Study of Remote Sensing Pretraining遥感预训练的实证研究
  2. 如何查看当前分支从哪个支线创建而来
  3. 使用MAC中碰到的各种问题
  4. C#-Excel导入工资条群发邮箱
  5. 【色彩管理】HSB色彩模式详解
  6. 关于自动内存管理垃圾的产生和GC的应运而生。
  7. xml和map相互转化
  8. CAD转PDF如何修改背景颜色
  9. 移动网络能“接管”生活?2014十大猜想
  10. 没想到这一天来的这么快 大数据之下再无隐私