Logo HelloWorld信息学奥赛题库

少儿编程

时间限制:1 s 空间限制:512 MB

#13104. 绘制地图

Statistics

题目描述

乐乐管理了⼀个巨⼤的城镇 。城镇可以看作是⼀个 n ⾏ m 列的矩形 ,其中,城镇的中⼼位于第 x0⾏ 、第y0列 。城镇中每个格⼦都⽤⼀个字符来表⽰ ,城镇地图的绘制⽅法如下:
⾸先在城镇的中⼼画上⼀个加号 +。    
给穿过城镇中⼼的⼀⾏画上减号 -。(城镇中⼼位置不画) 
给穿过城镇中⼼的⼀列画上竖线 |。(城镇中⼼位置不画)
从城镇中⼼出发 ,分别给斜左上⽅ 、斜右上⽅ 、斜右下⽅ 、斜左下⽅画上 \、/、\、/ 字 符 ,⼀直绘制直到到达地图边界。
以上横竖斜线将城镇分割为⼋个区域 ,按照顺时针⽅向给每个区域分别填上 A-H ⼋个字 母 ,如下图所⽰:

avatar

例如 ,对于以下 n=8,m=16 的例⼦ ,假设城镇的中⼼位于 (4,8) ,绘制的城镇地图如下:
GGGG\HH|AA/BBBBB
GGGGG\H|A/BBBBBB
GGGGGG\|/BBBBBBB
-------+--------
FFFFFF/|\CCCCCCC
FFFFF/E|D\CCCCCC
FFFF/EE|DD\CCCCC
FFF/EEE|DDD\CCCC
对于 n=7,m=4 ,城镇中⼼位于 (5,3) ,绘制的城镇地图如下:
HH|A
HH|A
\H|A
G\|/
--+-
F/|\
/E|D
如果 n=2,m=1 ,城镇中⼼位于 (2,1) ,绘制的城镇地图如下:
|
+
城镇实在是太⼤了 ,居民们不得不依靠 GPS 定位。因此,居民们希望你帮助他们开发⼀款地图应⽤,根据 GPS 位置 (第 x ⾏第 y 列) 绘制出以 (x,y) 为中⼼ ,⼤⼩为 5×5 的城镇地图。

输入格式

输⼊第⼀⾏四个整数 n,m,x0,y0,分别代表城镇区域的⾼度 (n ⾏) 、宽度 (m 列) 和城镇中⼼的 位置 (x0,y0) 。城镇中⼼的位置满⾜ 1≤x0≤n,1≤y0≤m。
输⼊第⼆⾏⼀个整数 Q , 代表绘制地图的请求数量 。 
接下来 Q ⾏ , 每⾏两个整数 x,y(1≤x≤n,1≤y≤m),表⽰⼀个请求 ,绘制出以第 x ⾏第 y 列为中⼼的 5×5 地图。

输出格式

为每个请求 x,y 输出 5 ⾏ ,每⾏ 5 个字符 ,为绘制的地图 。超出城镇边界的部分画井号 “#” 。
为了更好的视觉效果 ,在每个请求之后输出⼀个额外的空⾏。

样例数据

input

6 15 4 8
2
1 1
2 7

output

#####
#####
##GGG
##GGG
##GGG

#####
G\HH|
GG\H|
GGG\|
----+

数据范围:

对于 60% 的数据 ,满⾜ n,m≤1,000。
对于 100% 的数据 ,满⾜ 1≤n,m≤1,000,000。
对于 100% 的数据 ,满⾜ Q≤1,000。

提示:

char map[1000000][1000000] 将会占⽤约 1TB (1024GB) 的内存 。这远超过了我们可⽤的内存。
在 C/C++ 中 ,⼀个反斜杠字符 \ 在字符串或字符常量中 ,⽤两个反斜杠表⽰ ,例如:
char ch = '\\ ';  
char s [] = "\\"; // strlen(s) == 1
std::string s = "\\"; // s.length() == 1