📜  门| GATE-CS-2009 |问题 20(1)

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

门 | GATE-CS-2009 |问题 20

这道题目是GATE计算机科学考试中2009年的第20个问题。它是一道有趣的逻辑推理题,要求程序员通过观察一系列逻辑语句的真假情况,来判断有几个门被锁上了。在这个介绍中,我们将会详细解析这道题目的背景和解题思路,帮助程序员更好地理解问题的本质并迅速求解。

背景

考虑以下门的设置:

  • 在一个高楼的大厅里,有 $n$ 扇门排成一排。这些门被编号为 $1$ 到 $n$。
  • 在门的左边和右边,分别有一些传感器。这些传感器会判断门是否被锁上,然后输出真或假的结果。
  • 每个门都有两个传感器,一个在门的左边,一个在门的右边。如果左边或右边的传感器都显示门已锁上了,那么门就被锁住了。
  • 如果左边和右边的传感器都没有触发,那么门就被认为是打开的。
  • 然而这些传感器是不可靠的,它们可能会错误地输出一个错误的信号。

考虑以下 $n$ 个逻辑语句:

  • 逻辑语句 $i$ 是 "门 $i$ 被锁住了,如果且仅如果左传感器 $i$ 或者右传感器 $i +1@$ 输出了真。"。
  • 逻辑语句 $n+i$ 是 "门 $i$ 被锁住了,如果且仅如果左传感器 $(i+1)@ 或者右传感器 $i$ 输出了真。"。
问题描述

考虑一个用布尔值 $b_1, b_2, ..., b_{2n}$ 表示的 $2n$ 元布尔代数函数,在这个函数中 $b_i$ 表示第 $i$ 个语句的真假值。现在假设这个函数至少有一组输入,使得输出为 $true$,且假设语句不会互相矛盾。

请问有几扇门被锁上了?

解题步骤

该题目需要进行逻辑推理,并统计门被锁上的数量。下面是该题的解题步骤:

  1. 根据题目中的描述,可以将每个门的左传感器和右传感器组合成一个二元组表示门的状态。因此,每个逻辑语句实际上描述了两扇门的状态。可以将每个语句重新写成 “门i和门(i+1)均被锁住了,如果且仅如果左传感器i或右传感器(i+1)输出了真” 和 “门i和门(i+1)均被锁住了,如果且仅如果右传感器i或左传感器(i+1)输出了真” 的形式。这样,每两个逻辑语句将有一组相邻的门有关联。具体表现如下所示:

$$ \begin{aligned} & (l_1 \vee r_2) \wedge (l_2 \vee r_3) \wedge \cdots \wedge (l_{n-1} \vee r_n) \wedge (l_n \vee r_1) \quad \text{(1)} \ & (r_1 \vee l_2) \wedge (r_2 \vee l_3) \wedge \cdots \wedge (r_{n-1} \vee l_n) \wedge (r_n \vee l_1) \quad \text{(2)} \end{aligned} $$

  1. 对于每两个逻辑语句(1)和(2),可以将它们合并起来,形成一个 $2n$ 元布尔代数函数。这个函数将告诉我们哪些门被锁上了。如果布尔代数函数的输出为 $true$,那么这两个门中至少有一扇门被锁上了。具体表现如下所示:

$$ \begin{aligned} b_1 =& (l_1 \vee r_2) \wedge (r_1 \vee l_2) \ b_2 =& (l_2 \vee r_3) \wedge (r_2 \vee l_3) \ & \cdots \ b_n =& (l_n \vee r_1) \wedge (r_n \vee l_1) \ b_{n+1} =& (r_1 \vee l_2) \wedge (l_1 \vee r_2) \ b_{n+2} =& (r_2 \vee l_3) \wedge (l_2 \vee r_3) \ & \cdots \ b_{2n} =& (r_n \vee l_1) \wedge (l_n \vee r_1) \end{aligned} $$

  1. 根据题目描述,我们知道至少有一个输入会使得这个函数的输出为 $true$。因此,我们可以使用Quine-McCluskey算法进行布尔函数化简,以找到尽可能少的最小项,这些最小项满足当输入为任意一组满足条件的输入时都能输出 $true$。这些最小项就对应着门被锁上的情况。具体布尔函数化简的操作可见参考文献部分。

  2. 统计最小项的数量就是锁住门的数量。

参考文献
  1. P. Linz, An Introduction to Formal Languages and Automata, Jones and Bartlett Publishers, Boston, 2006.
  2. K. N. King, C Programming: A Modern Approach, 2nd ed., W. W. Norton and Company, New York, 2008.
  3. R. Rudell, "The Quine-McCluskey Algorithm", in Encyclopedia of Computer Science and Technology, 3rd ed., vol. 41, M. Bates, Ed., CRC Press, 2001, pp. 266-292.
  4. D. Gries, The Science of Programming, Springer, Berlin, 1981.