关于题面和样例
查看原帖
关于题面和样例
497508
佬头楼主2023/8/24 21:41

题目描述

你需要模拟一个公式编辑器。

公式内一共存在三种类型的元素:字符(数字,字母,括号和算术运算符),分式和矩阵。其中分式的分子和分母以及矩阵的所有单元格又各自是一个互不相同的公式且每个公式都有一个编辑框。

如图所示,F1、F2、F3、F4、F5 都是互不相同公式,所以都有各自的编辑框。

可以看到编辑框是可以嵌套的。如果框 A 直接包含框 B,那么我们就称框 A 是框 B 的父框(例如:F1 是 F2 和 F3 的父框,F3 是 F4 和 F5 的父框);如果框 A 和框 B 有相同的父框,我们说它们是同级框(例如:F4 和 F5 是同级框,F2 和 F3 也是同级框)。

在任何时候,光标总是直接包含在一个编辑框中。它可能位于框中所有元素的左侧(即编辑框的首部位置),也可能位于所有元素的右侧(即编辑框的尾部位置),或者位于两个连续元素之间。对于光标左侧(右侧)第一个元素(若存在),我们称之为光标的直接左侧(右侧)元素。

光标一共支持六种移动方式:Home,End,Up,Down,Left, Right。假设 A 是直接包含光标的编辑框,则:

Home(End):将光标移动至 A 的首部(尾部)位置。

Up(Down):如果 A 的正上方(下方)有一个同级框,则将光标放在该框的首部位置;否则查看 A 的父框,如果 A 的父框的正上方(下方)有一个同级框,则移至该框的首部位置,否则查看 A 的父框的父框...如果 A 的所有祖先框中都没有这样的同级框,不执行任何操作。

Left(Right):有四种情况。

  1. 如果光标位于 A 的首部(尾部)位置,则将光标移动至 A 的直接左侧(右侧)同级编辑框的尾部(首部)位置。如果没有这样的框,则将光标放至 A 在其父框中的直接左侧(右侧),如果 A 没有父框,不执行任何操作。
  2. 如果光标的直接左侧(右侧)元素是分数,则将光标放在其分子的尾部(首部)位置。
  3. 如果光标的直接左侧(右侧)元素是一个 nn 行 mm 列的矩阵,则将光标放置在第 ⌈n2⌉\lceil\frac{n}{2}\rceil 行和第 mm 列(第 11 列)对应的编辑框的尾部(首部)位置。
  4. 如果光标的直接左侧(右侧)元素是字符,则将光标放在该字符的直接左侧(右侧)。

输入格式

输入文件包含多组数据,每行一个字符串。

  1. 如果是单个字符,在光标处插入该字符,并将光标移到其右侧。
  2. 如果是 Matrix(Fraction),则在光标处插入一个 1×11\times1 的矩阵(分式),然后向右移动光标。请注意,在向右移动光标之前,新的矩阵(分式)位于光标的右侧。
  3. 如果是 AddRow(AddCol),则找到包含光标的最小矩阵单元格并在其上方(左侧)插入一行(列),再将光标放置在新行(列)的同一列(行)中。如果没有包含光标的矩阵单元格,则忽略此命令。
  4. 如果是 Home,End,Up,Down,Left,Right 中的一个,则根据上面的规则移动光标。
  5. 如果是 Done,表示一组数据输入结束。

输出格式

对于每组输入数据你需要在第一行打印用例编号,再在换行后输出一个字符矩阵表示公式(每行末尾没有空格,但不要省略空行,例如:在样本输出 33 的末尾有一个空行),再在最后输出一个空行。字符矩阵是所有元素的字符矩阵的水平连接,公式内直接包含的分式、矩阵的基线与公式基线对齐(稍后将解释)。连续元素之间没有空格,内部矩形和外部矩形的边界之间没有额外的空行或者空列。公式中每个元素的字符矩阵:

  1. 字符只占据一行,这一行被称作基线。特别地,我们使用三个字符 ' - ' 来表示字符 '-'。
  2. 矩阵的格式如下:首先,格式化矩阵的所有单元格,然后将它们排列成矩阵。同一行的框的基线互相对齐,同一列中的框水平对齐。连续行用空行分隔,连续列用空列分隔。最后,在每行基线的两侧添加一对方括号。如果有奇数行,整个矩阵的基线就是中间那行的基线。否则,整个矩阵的基线就是中间的空行。
  3. 分式的格式如下:首先,格式化分母和分子,然后在这两个框之间画一条水平线(由 - 组成),这也是整个分式的基线。水平线的宽度是分子与分母的宽度的较大值加上二(即两边多出一个 -)。分母和分子水平对齐。

在水平对齐字符矩阵时,我们会固定最宽矩阵的位置,并尝试移动其他矩矩阵,以便它们与最宽矩形的中心列重合。如果对不齐(宽度奇偶性不同的矩阵),可以将这些向左移动 12\frac{1}{2} 个单位,比如这样:

 XXXX 
------
 XXX  

有一种特殊情况:如果一个公式为空,则字符矩阵为一个空行,其宽度为零,但高度为一。

输入输出样例

输入

-
5
Fraction
1
Down
6
Right
*
Matrix
AddCol
AddCol
1
Right
2
Right
3
Right
*
Matrix
AddRow
AddRow
1
Down
2
Down
3
Done
1
+
Fraction
1
Down
1
+
Fraction
1
Down
1
+
Fraction
1
Down
x
Up
Up
Right
Right
Home
Up
Done
Fraction
a
Done
Matrix
Fraction
a
Down
b
Matrix
Fraction
c
Down
d
AddRow
e
Done

输出

Case 1:
                [1]
     1
 - 5---*[1 2 3]*[2]
     6
                [3]

Case 2:
       1
1+-----------
        1
   1+-------
         1
      1+---
         x

Case 3:
 a
---


Case 4:
    a
[--------]
   [ e ]
  b
     c
   [---]
     d


说明/提示

每个测试用例中最多有 10001000 个命令,并且整个输入大小不超过 200KB。

得出的公式在数学上并不一定正确。输出格式必须严格按照题目要求。

2023/8/24 21:41
加载中...