#NJ2024E. 城镇地图

城镇地图

E - 城镇地图

时空限制

  • CPU占用时长: 1秒
  • 内存使用限制: 128MB

题目描述

乐乐管理了一个巨大的城镇。城镇可以看作是一个 nnmm 列的矩形,其中,城镇的中心位于第 x0x_0 行、第 y0y_0 列。城镇中每个格子都用一个字符来表示,城镇地图的绘制方法如下:

  • 首先在城镇的中心画上一个加号 +
  • 给穿过城镇中心的一行画上减号 -。(城镇中心位置不画)
  • 给穿过城镇中心的一列画上竖线 |。(城镇中心位置不画)
  • 从城镇中心出发,分别给斜左上方、斜右上方、斜右下方、斜左下方画上 \/\/ 字符,一直绘制直到到达地图边界。
  • 以上横竖斜线将城镇分割为八个区域,按照顺时针方向给每个区域分别填上 A-H 八个字母,如下图所示:

例如,对于以下 n=8,m=16n = 8, m = 16 的例子,假设城镇的中心位于 (4,8)(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=4n = 7, m = 4,城镇中心位于 (5,3)(5, 3),绘制的城镇地图如下:

HH|A
HH|A
\H|A
G\|/
--+-
F/|\
/E|D

如果 n=2,m=1n = 2, m = 1,城镇中心位于 (2,1)(2, 1),绘制的城镇地图如下:

|
+

城镇实在是太大了,居民们不得不依靠 GPSGPS 定位。因此,居民们希望你帮助他们开发一款地图应用,根据 GPSGPS 位置 (第 xx 行第 yy 列) 绘制出以 (x,y)(x, y) 为中心、大小为 5×55 \times 5 的城镇地图。

输入格式

输入第一行四个整数 n,m,x0,y0n, m, x_0, y_0,分别代表城镇区域的高度 (nn 行)、宽度 (mm 列) 和城镇中心的位置 (x0,y0)(x_0, y_0)。城镇中心的位置满足 1x0n,1y0m1 \le x_0 \le n, 1 \le y_0 \le m

输入第二行一个整数 QQ,代表绘制地图的请求数量。接下来 QQ 行,每行两个整数 x,yx, y (1xn,1ym1 \le x \le n, 1 \le y \le m),表示一个请求,绘制出以第 xx 行第 yy 列为中心的 5×55 \times 5 地图。

输出格式

为每个请求 x,yx, y 输出 55 行,每行 55 个字符,为绘制的地图。超出城镇边界的部分画井号 #

为了更好的视觉效果,你可以选择在每个请求之后输出一个额外的空行(是否输出额外空行不影响正确性)。

输入输出样例

样例 1

输入:

6 15 4 8
2
1 1
2 7

输出:

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

#####
\HH|A
G\H|A
GG\|/
---+-

数据范围与提示

  • 对于 60%60\% 的数据,满足 n,m1000n, m \le 1000
  • 对于 100%100\% 的数据,满足 1n,m10000001 \le n, m \le 1000000
  • 对于 100%100\% 的数据,满足 Q1000Q \le 1000

注意:

char map[1000000][1000000] 将会占用约 1TB (1024GB) 的内存。这远超过了我们可用的内存。

在 C/C++ 中,一个反斜杠字符 \ 在字符串或字符常量中,用两个反斜杠表示,例如:

char ch = '\\';
char s[] = "\\"; // strlen(s) == 1
std::string s = "\\"; // s.length() == 1