博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CCF-201512-3 绘图
阅读量:6977 次
发布时间:2019-06-27

本文共 2823 字,大约阅读时间需要 9 分钟。

问题描写叙述

  用 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 
#include
#include
#include
#include
#include
using namespace std;const int maxn = 105;char pic[maxn][maxn];int dir[4][2] = { {-1, 0}, { 0, -1}, { 1, 0}, { 0, 1} };int n, m, q;void print(){ for(int i = 0; i < n; ++i){ for(int j = 0; j < m; ++j) cout << pic[i][j]; cout << endl; }}void Map(int& x, int& y){ int t = x; x = n - 1 - y; y = t;}void dfs(int r, int c, char ch){ pic[r][c] = ch; for(int i = 0; i < 4; ++i) { int nr = r + dir[i][0], nc = c + dir[i][1]; if(nr < 0 || nr >= n || nc < 0 || nc >= m || pic[nr][nc] == '-' || pic[nr][nc] == ch || pic[nr][nc] == '|' || pic[nr][nc] == '+') continue; dfs(nr, nc, ch); }}int main(){ #ifdef LOCAL fstream cin("data.in"); #endif // LOCAL cin >> m >> n >> q; for(int i = 0; i < n; ++i){ for(int j = 0; j < m; ++j) pic[i][j] = '.'; } while(q--){ int op, x1, y1, x2, y2; char ch; cin >> op; if(op == 0) { cin >> x1 >> y1 >> x2 >> y2; Map(x1, y1); Map(x2, y2); if(x1 == x2){ if(y1 > y2) swap(y1, y2); for(int i = y1; i <= y2; ++i){ if(pic[x1][i] == '|') pic[x1][i] = '+'; else if(pic[x1][i] != '+') pic[x1][i] = '-'; //'+'不要被覆盖 } } else{ if(x1 > x2) swap(x1, x2); for(int i = x1; i <= x2; ++i){ if(pic[i][y1] == '-') pic[i][y1] = '+'; else if(pic[i][y1] != '+') pic[i][y1] = '|'; } } } else { cin >> x1 >> y1 >> ch; Map(x1, y1); dfs(x1, y1, ch); } } for(int i = 0; i < n; ++i){ for(int j = 0; j < m; ++j) cout << pic[i][j]; cout << endl; } return 0;}

转载地址:http://oqupl.baihongyu.com/

你可能感兴趣的文章
java 返回年月的第一天 和最后一天【转载】
查看>>
原创:ASP.Net状态管理读书笔记--思维导图
查看>>
爬虫大作业-爬区a9vg电玩部落ps4专区
查看>>
Android的图形显示原理(GDI)一
查看>>
CORS跨域请求限制-options预检请求
查看>>
Python正则表达式精讲
查看>>
Python字符串拼接、截取及替换方法总结
查看>>
3.Session安装配置
查看>>
MXNet学习:预测结果-识别单张图片
查看>>
NuGet 无法连接到远程服务器-解决方法
查看>>
第22周二
查看>>
数位dp(求1-n中数字1出现的个数)
查看>>
AMD and CMD are dead之js模块化黑魔法
查看>>
Tesseract 3 语言数据的训练方法
查看>>
memcached Logging
查看>>
数学图形(1.40)T_parameter
查看>>
js获取Html元素的实际宽度高度
查看>>
SiteMapPath基本用法
查看>>
struts2学习笔记--线程安全问题小结
查看>>
task
查看>>