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

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

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

这是一道关于门电路的问题,涉及程序员需要掌握的基本电路知识。在本题中,我们需要根据门的输入输出给出门电路的状态。

问题描述

门是电子电路中最基本的逻辑元件之一。在此题中,我们定义了两个数学运算门:且门和或门。在这些门的输入中,每个输入均可为 0 或 1。以下是且门的定义:

| 输入 E1 | 输入 E2 | 输出 | | ------- | ------- | ------ | | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 |

以下是或门的定义:

| 输入 E1 | 输入 E2 | 输出 | | ------- | ------- | ------ | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 1 |

现在,我们给出了一个门,但无法确定它是且门还是或门。但是,我们可以提供测试信号,并观测输出。给你从门输入到门输出的所有情况,请确定该门是且门还是或门。

输入

输入的第一行包含一个整数 T,表示测试用例的数量。对于每个测试用例,第一行包含一个整数 n,表示测试信号 E1 和 E2 的数量。随后的 n 行,每行描述一组输入和输出。每行包含四个整数 E1i,E2i,X1i 和 X2i(0≤E1i,E2i,X1i,X2i≤1),表示输入 E1i 和 E2i 经过门后得到输出 X1i 和 X2i。

输出

对于每个测试用例,如果门是且门,请输出 AND;否则,请输出 OR。

样例

输入:

2

4

0 0 0 0

0 1 0 0

1 0 0 0

1 1 1 1

4

0 0 0 0

0 1 1 1

1 0 1 1

1 1 1 1

输出:

AND

OR

解释

对于第一个测试用例,门为且门。输入与门的定义相符。

对于第二个测试用例,门为或门。输入与门的定义相符。

解决方案

这是一个逻辑电路问题。我们需要根据多个输入的组合来判断门是且门还是或门。对于这种类型的问题,我们可以使用真值表或卡诺图来解决。

真值表

真值表是将门的输入和输出用表格的形式列出的方法。我们可以根据每个输入组合的输出来判断门是什么类型。

例如,对于第一个测试用例,我们可以得到以下真值表:

| E1 | E2 | X1 | X2 | AND | | -- | -- | -- | -- | --- | | 0 | 0 | 0 | 0 | 1 | | 0 | 1 | 0 | 0 | 1 | | 1 | 0 | 0 | 0 | 1 | | 1 | 1 | 1 | 1 | 1 |

从输出列可以看出门是一个且门。

卡诺图

在逻辑电路中,卡诺图是一种通过图解法求解布尔代数问题的工具。在卡诺图中,我们可以将门的输入输出用方格表示,并将相邻的 1 连成一个矩形。我们可以通过矩形的大小和位置来确定门的类型。

例如,对于第一个测试用例,我们可以得到以下卡诺图:

             E2
        0    1
     +--------+
   0 | 0 | 0  |
E1   +---+----+
   1 | 0 | 1  |
     +--------+

在这个卡诺图中,我们可以看到 1 构成了一个 2×2 的矩形,这说明门是一个且门。

代码

下面的代码演示了如何读入测试用例并对每个测试用例解决问题。我们首先将输入信号和输出信号列表转换为一个真值表,然后使用卡诺图解决问题。

def read_test_case():
    n = int(input())
    inputs = []
    outputs = []
    for i in range(n):
        e1, e2, x1, x2 = map(int, input().split())
        inputs.append((e1, e2))
        outputs.append((x1, x2))
    return inputs, outputs

def truth_table(inputs, outputs):
    table = {}
    for x in range(2):
        for y in range(2):
            for z in range(2):
                i = (x, y)
                o = (z, z) if (x, y) in inputs else outputs[inputs.index((x, y))]
                table[(x, y, z)] = o[0] == z and o[1] == z
    return table

def karnaugh_map(table):
    rows = [[False for _ in range(2)] for _ in range(2)]
    cols = [[False for _ in range(2)] for _ in range(2)]
    for (x, y, z), value in table.items():
        if value:
            rows[x][y] = True
            cols[y][x] = True
    if rows[0][0] and rows[0][1] and rows[1][0] and rows[1][1]:
        return "AND"
    elif cols[0][0] and cols[0][1] and cols[1][0] and cols[1][1]:
        return "OR"
    else:
        return "UNKNOWN"

def solve_test_case():
    inputs, outputs = read_test_case()
    table = truth_table(inputs, outputs)
    return karnaugh_map(table)

def main():
    t = int(input())
    for i in range(t):
        print(solve_test_case())

main()