QOJ.ac

QOJ

Time Limit: 2 s Memory Limit: 1024 MB Total points: 100

#6115. 积木与表达式

Statistics

为了高效地评估程序,语言处理器通常将其转换为语法树。在本题中,你将获得一个用 ASCII 字符表示的数学表达式语法树。请计算该表达式的值。

本题所考虑的语法树是一棵有根二叉树,其中每个节点要么有零个子节点,要么有两个子节点。如果一个节点有零个子节点,它就是一个整数节点,对应一个 $0$ 到 $9$ 之间的整数。另一方面,如果一个节点有两个子节点,它就是一个二元运算节点,对应加法、减法或乘法中的一种二元运算。在这种情况下,左子节点和右子节点分别对应二元运算的左操作数和右操作数。例如,下图展示了表达式 $(9 - 4) \cdot ((7 \cdot 2) + 5)$ 的语法树。

为了使用 ASCII 字符表示这样的语法树,你将获得 $H$ 行 $W$ 列的字符。每个字符要么是 ‘+’、‘-’、‘*’,要么是 ‘0’ 到 ‘9’ 之间的数字,或者是代表空白的句点 ‘.’。例如,以下是图 B.1 中语法树的表示:

...*.....
.-.....+.
9.4..*..5
....7.2..

下图展示了这种语法树表示的规则(类似于巴科斯-诺尔范式,BNF):

更具体地说,规则定义如下:

  • 块 (block) 是一个矩形字符区域,对应语法树中的单个节点(即整数节点或二元运算节点)。
  • 对应整数节点的块仅包含一个数字,即该节点对应的整数。此类块的高度和宽度均为 $1$。
  • 对应二元运算节点 $v$ 的块 $c$ 包含一个运算符和两个作为子节点的块。更具体地说,设 $v_1$ 和 $v_2$ 分别为该二元运算节点的左子节点和右子节点,设 $c_1$ 和 $c_2$ 分别为对应 $v_1$ 和 $v_2$ 的块。块 $c$ 的高度为 $\max(h_1, h_2) + 1$,其中 $h_1$ 和 $h_2$ 分别是 $c_1$ 和 $c_2$ 的高度。另一方面,$c$ 的宽度为 $w_1 + w_2 + 1$,其中 $w_1$ 和 $w_2$ 分别是 $c_1$ 和 $c_2$ 的宽度。$c$ 的最顶行由 $w_1$ 个句点、一个运算符(‘+’、‘-’ 或 ‘*’)以及 $w_2$ 个句点组成。$c_1$ 位于 $c$ 的第 $2$ 行到第 $(h_1 + 1)$ 行(从上往下数)以及第 $1$ 列到第 $w_1$ 列(从左往右数)。类似地,$c_2$ 位于 $c$ 的第 $2$ 行到第 $(h_2 + 1)$ 行(从上往下数)以及第 $(w_1 + 2)$ 列到第 $(w_1 + w_2 + 1)$ 列(从左往右数)。注意,尽管 $c_1$ 和 $c_2$ 的高度可能不同,但它们的顶部边界始终对齐。
  • 上述规则保证了没有两个块会部分重叠。换句话说,当两个块重叠时,其中一个块完全包含另一个块。
  • 任何未受上述规则限制的字符均填充为句点。
  • 整个字符区域即为“根”块。换句话说,对应语法树根节点的块高度为 $H$,宽度为 $W$。

你的任务是计算由上述规则格式化的给定语法树所对应的数学表达式的值。

输入格式

第一行包含两个整数 $H$ 和 $W$ ($1 \le H, W \le 37$),表示给定语法树表示的高度和宽度。接下来的 $H$ 行包含长度为 $W$ 的字符串,其中每个字符要么是 ‘+’、‘-’、‘*’,要么是 ‘0’ 到 ‘9’ 之间的数字,或者是句点。保证这些字符串表示一个格式合法的数学表达式语法树。

输出格式

打印给定输入所对应的数学表达式的计算结果。

样例

样例输入 1

1 1
5

样例输出 1

5

样例输入 2

2 3
.-.
9.2

样例输出 2

7

样例输入 3

4 9
...*.....
.-.....+.
9.4..*..5
....7.2..

样例输出 3

95

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.