#P16586. [GKS 2016 #C] Evaluation
[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 本身,导致无法求值该语句。
输入格式
输入的第一行给出测试用例的数量 。接下来有 个测试用例。每个测试用例的第一行包含一个整数 :赋值语句的条数。随后 行,每行包含一条赋值语句。
每条赋值语句由三部分组成:赋值变量、赋值运算符和表达式,中间没有空格。赋值运算符始终为 =。所有表达式均由一个函数名,后跟 (,再跟零个或多个由逗号分隔的变量名,最后跟 ) 构成。所有变量名和函数名均由一个或多个小写英文字母组成。没有变量名与函数名相同。没有变量会作为赋值变量出现多次。然而,变量可以在不同函数中(甚至同一函数内)出现多次,函数也可以出现多次。
输出格式
对于每个测试用例,输出一行,格式为 Case #x: y,其中 是测试用例编号(从 开始), 是所有变量均可求值时的 GOOD,否则输出 BAD。
4
3
a=f(b,c)
b=g()
c=h()
2
a=f(b)
b=f(a)
2
aaa=foo(x,y)
bbb=bar(aaa,bbb)
2
x=f()
y=g(x,x)
Case #1: GOOD
Case #2: BAD
Case #3: BAD
Case #4: GOOD
提示
限制条件
。
所有函数的参数个数在 到 之间(包含端点)。所有变量名由 到 个小写英文字母组成。
小数据集(测试集 1 – 可见)
。
大数据集(测试集 2 – 隐藏)
。
翻译由 DeepSeek V4 Pro 完成