P16586 [GKS 2016 #C] Evaluation

题目描述

给定一个无序的赋值语句列表,请编写一个程序,判断是否存在某种顺序,使得所有变量都能被求值。 在我们的问题中,一条赋值语句依次由赋值变量、赋值运算符和表达式组成。语句将按照你选择的顺序逐条求值。一个变量当且仅当它先前已经成为某条赋值语句的赋值变量时,才可以被求值。 为简化问题,所有表达式都是单个函数调用。函数可以接受任意数量的参数(包括零个);参数个数为零的函数总是合法的,而带变量参数的函数,仅当所有变量均可求值时才是合法的。 例如,对于以下赋值语句列表: ``` a = f(b, c) b = g() c = h() ``` 下面这个顺序使得每条语句都合法: ``` b = g() c = h() a = f(b, c) ``` 这是因为:(1)b 和 c 可以被求值,因为表达式 `g()` 和 `h()` 不依赖于任何变量;(2)a 也可以被求值,因为表达式 a 依赖于 b 和 c,而 b 和 c 是可求值的。 然而,顺序 ``` b = g() a = f(b, c) c = h() ``` 是不合法的,因为 `f(b, c)` 的参数中包含变量 c,而变量 c 尚未成为赋值变量。 再举一例:`a = f(a)`。这个语句列表无法被求值,因为表达式 `f(a)` 依赖于变量 a 本身,导致无法求值该语句。

输入格式

输入的第一行给出测试用例的数量 $T$。接下来有 $T$ 个测试用例。每个测试用例的第一行包含一个整数 $N$:赋值语句的条数。随后 $N$ 行,每行包含一条赋值语句。 每条赋值语句由三部分组成:赋值变量、赋值运算符和表达式,中间没有空格。赋值运算符始终为 `=`。所有表达式均由一个函数名,后跟 `(`,再跟零个或多个由逗号分隔的变量名,最后跟 `)` 构成。所有变量名和函数名均由一个或多个小写英文字母组成。没有变量名与函数名相同。没有变量会作为赋值变量出现多次。然而,变量可以在不同函数中(甚至同一函数内)出现多次,函数也可以出现多次。

输出格式

对于每个测试用例,输出一行,格式为 `Case #x: y`,其中 $x$ 是测试用例编号(从 $1$ 开始),$y$ 是所有变量均可求值时的 `GOOD`,否则输出 `BAD`。

说明/提示

### 限制条件 $1 \le T \le 20$。 所有函数的参数个数在 $0$ 到 $10$ 之间(包含端点)。所有变量名由 $1$ 到 $20$ 个小写英文字母组成。 **小数据集(测试集 1 – 可见)** $1 \le N \le 100$。 **大数据集(测试集 2 – 隐藏)** $1 \le N \le 1000$。 翻译由 DeepSeek V4 Pro 完成