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 完成