📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 3(1)

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

门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 3

这是一道关于门电路的算法题。门是逻辑电路中的重要组成部分,可用于处理和传递信号。

问题描述

考虑由 $n$ 个逻辑门组成的电路,其中 $0 \leq n \leq 10^4$。每个门可以是以下 $4$ 种类型之一:

  • and: 当且仅当所有输入都是 $1$ 时输出 $1$;
  • or: 当任意一个输入是 $1$ 时输出 $1$;
  • not: 它只有一个输入,当它的输入为 $0$ 时输出 $1$,否则输出 $0$;
  • true: 它恒输出 $1$;
  • false: 它恒输出 $0$。

你的任务是实现一个算法,计算出整个电路的输出。

对于每个门,我们已知它的类型以及输入连接的门的编号,如果它有 $k$ 个输入,那么这些编号将被给出为 $k$ 个整数 $a_1, a_2, \ldots, a_k$,表示这些输入是由电路中第 $a_1, a_2, \ldots, a_k$ 个门输出的。

门的编号从 $1$ 到 $n$,且第一个门是输入门。输入门没有类型,其数量为 $m$。

输入格式

输入的第一行包含一个整数 $m$,表示输入门的数量。

接下来 $m$ 行,每行一个非负整数 $x$,表示输入门与第 $i$ 个输入连接的门的编号。如果 $x=0$,则表示该输入门直接输出 $0$。

输入的第 $m+1$ 行包含一个整数 $n$,表示整个电路中门的数量。

接下来 $n$ 行,每行表示一个门。具体格式如下:

  • 对于一个 not 类型的门,格式为 not i j,其中 $i$ 表示该门的编号,$j$ 表示输入门的编号。
  • 对于其他类型的门,格式为 type i k a1 a2 ... ak,其中 $type$ 表示门的类型(为 true, false, and, 或 or),$i$ 表示该门的编号,$k$ 表示该门的输入数量,$a_1,a_2,\ldots,a_k$ 表示与该门连接的其他门的编号。

$\texttt{and}$ 表示逻辑 "and",$\texttt{or}$ 表示逻辑 "or",$\texttt{true}$ 和 $\texttt{false}$ 分别表示逻辑上的真和假。

输出格式

输出一个二进制数,表示整个电路的输出。

样例

输入:

2
1
1
not 2 1
true 1 0

输出:

0
解题思路

本题可以使用递归或迭代的方式实现。假设我们已经知道一个门的每个输入是 $0$ 还是 $1$,那么我们就可以计算出这个门的输出。

经典的实现方式是利用递归函数。我们可以定义一个函数 solve(i) 表示计算编号为 $i$ 的门的输出。对于不同的门类型,这个函数的实现方式也是不同的:

  • 对于 true 类型的门,输出 $1$;
  • 对于 false 类型的门,输出 $0$;
  • 对于 not 类型的门,计算其输入门的输出,然后取反;
  • 对于 and 类型的门,计算每一个输入门的输出,如果有一个是 $0$,则输出 $0$,否则输出 $1$;
  • 对于 or 类型的门,计算每一个输入门的输出,如果有一个是 $1$,则输出 $1$,否则输出 $0$。

可以注意到,在递归函数中,我们需要直接递归调用自己。由于我们并不知道递归调用的顺序,因此这个函数的时间复杂度很难估计,但是由于电路的规模较小,我们可以预估它的时间复杂度不会超过 $\mathcal O(n^2)$。

代码实现

下面是使用递归方式实现的样例代码: