首页 > 试题广场 >

聊天消息排版

[编程题]聊天消息排版
  • 热度指数:297 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

在网游中,聊天功能是一项非常重要的功能,加上玩家可以打出游戏内置的一些表情图片,因此需要实现一个图文混排系统,如上图所示。

玩家在聊天框输入的是一段utf-8编码的文字,且只会包含中文、英文、中英文的标点符号和空格(不会出现换行、回车和制表符)。按照网易游戏的传统,井号(#)是作为一个转义字符,支持下面几种转义行为:

1. #加一个数字来表示内置的表情图片,为了简化问题,我们这里只支持20个表情图片,从0开始计数,并且数字是按最长匹配原则去匹配,比如 #0 表示0号表情图片、#1 表示1号表情图片 、#19表示19号表情图片、#20则表示2号表情图片后面加数字0。需要注意的是#00表示的是0号表情图片加后面数字0

2. #r 表示换行,遇到以后会自动切换到下一行开始排版。

3. ## 表示显示出#这个符号

4.如果玩家不按规则输入错误的转义,则按照玩家的输入原样显示,比如#a##,#

 


上图所示的玩家输入为:Hello world#大家好#r欢迎大家参加网易雷火校园招聘#1祝大家取得好成绩”

 

排版的时候需要像上图一样,将文字从起始位置开始,依次显示在聊天窗口里,一些显示规则如下所示:

1.聊天窗口的宽度固定为W像素,起始坐标为左上角,坐标为(0, 0),右上角坐标为(W-1, 0),坐标向右向下增长。任何文字和表情必须显示在窗口内,不能超出窗口。但是高度可以无限向下延伸。

2.显示的字体均为等宽字体,英文(包括英文标点符号和空格)的字体宽度统一为XE,高度统一为YE。中文(包括中文的标点符号)的字体宽度统一为XC,高度统一为YC

3.每个表情图片的宽高是独立的,0号表情图片的宽度为 X0,高度Y0,依次类推,19号表情图片的宽度为X19,高度为Y19

4.字符(中英文以及标点符号、空格等,下同)与字符之间、字符与表情之间、表情与表情之间都需要额外保留一个PX像素的字间距。每一行第一个字符左边,以及最后一个字符右边不需要保留字间距。

5.当下一个字符或者表情无法在本行W宽度的像素内完整显示的话,则会强行换到下一行首开始显示。遇到#r的时候也会自动换到下一行开始显示下一个字符或表情。

6.在一行里出现高度不同的中英文以及表情的时候,需要将其底部对齐。

7.当一行里没有任何字符或表情,直接被#r换行的时候,这一行的高度算英文字体的高度。

8.每一行里高度最高的字符或表情,需要同上一行的的底部保留PY像素的行间距。第一行上面与最后一行下面不需要保留行间距。

9.最后一个字符或表情显示显示以后,它的右下角坐标则为结束坐标。也就是本题需要求解的问题。输入保证最后不会以#r结尾。


输入描述:
每个测试输入包含1个测试用例

第一行为7个正整数W, XE, YE, XC, YC, PX, PY

第二行为40个正整数X0,
Y0, X1, Y1…X19, Y19

第三行为长度不超过10000的十六进制编码过的玩家输入,即玩家输入的utf-8编码的数据每个字节的数字转成大写的十六进制表示,不足两位的话前面补0(同C里printf的%X格式化),然后不同字节的十六进制编码表示依次拼接起来。

比如Hello的十六进制编码表示为48656C6C6F。

前两行的各个数字含义如上文描述,其中50<W<10000,0<其他<50。


输出描述:
输出用空格隔开的两个数字,表示结束坐标
示例1

输入

60 2 4 3 4 1 3
7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6 7 6
48656C6C6F20776F726C6423E5A4A7E5AEB6E5A5BD2372E6ACA2E8BF8EE5A4A7E5AEB6E58F82E58AA0E7BD91E69893E99BB7E781ABE6A0A1E59BADE68B9BE881982331E7A59DE5A4A7E5AEB6E58F96E5BE97E5A5BDE68890E7BBA9

输出

38 19