📜  门| GATE-CS-2001 |问题 15(1)

📅  最后修改于: 2023-12-03 15:28:41.219000             🧑  作者: Mango

问题 15 - 门

题目描述

给定一个布尔代数表达式式子,其中只包含 'AND''OR''NOT' 运算符,和布尔变量,用括号表示次序(和数学中的方式一样)。请编写一个程序,输出一个哪些变量需要作为输出信息,使得基于这些变量和表达式的计算结果,可以确定每一个变量的值。

例如,表达式为

( A AND B ) OR ( B AND C )

需要输出的变量为 A, B, C

输入格式

输入的第一行给出一个正整数 $T$,表示测试数据组数。

随后的 $T$ 行中,每行给定一个字符串,表示一个布尔代数表达式式子。式子中仅包含大写字母、数字、括号、以及 'AND''OR''NOT' 运算符。题目保证输入的表达式式子是合法的,且其值可以通过某些变量的赋值确定。

输出格式

对每组测试数据,先在第一行中输出该测试数据的序号,格式为 #ID: ,其中 $ID$ 是从 $1$ 开始的自然数。

在第二行中按字典序输出哪些变量需要作为输出信息,每个变量后跟一个空格。若没有变量需要输出,则输出一个空行。

样例

输入样例:

3
(A AND B) OR (C AND D)
NOT(A) OR NOT(NOT(B) AND C)
NOT(A)

输出样例:

#1: A B C D 
#2: B C 
#3: A 
提示

数据范围

表达式式子的长度不超过 $100$。输入的表达式式子保证是合法的,并且其值可以通过某些变量的赋值确定。

解题思路

本题的关键就是将输入的代数表达式转化成表的形式。以样例输入的第一个表达式为例:

(A AND B) OR (C AND D)

通过公式转化,可以得到以下四个子表达式:

T[("A", 0), ("B", 0)] = True
T[("A", 1), ("B", 0)] = False
T[("A", 0), ("B", 1)] = False
T[("A", 1), ("B", 1)] = True

T[("C", 0), ("D", 0)] = False
T[("C", 1), ("D", 0)] = False
T[("C", 0), ("D", 1)] = True
T[("C", 1), ("D", 1)] = True

T[("A", 0)] = False
T[("A", 1)] = True

T[("B", 0)] = False
T[("B", 1)] = True

T[("C", 0)] = False
T[("C", 1)] = True

T[("D", 0)] = False
T[("D", 1)] = True

可以发现,子表达式的总数是 $2^k$ 个,其中 $k$ 为变量的数目。对于每个子表达式,其值为真或假,表示一个关于所有变量的布尔函数。因此,我们可以通过检查每个子表达式的值来确定哪些变量需要作为输出信息。