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

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

【题目描述】

现有 n 个门,每个门由以下 k 个选择之一控制:

  1. $\texttt{XOR}$:对门上的锁进行 $\texttt{XOR}$ 操作(即,如果锁是关闭的,则变为打开状态;如果打开,则变成关闭)。

  2. $\texttt{NOT}$:对门上的锁进行 $\texttt{NOT}$ 操作(即,如果锁是打开的,则变为关闭状态,反之亦然)。

  3. $\texttt{OPEN}$:将门打开。

  4. $\texttt{CLOSE}$:将门关闭。

现在,给定一个开锁方案,请编写一个程序来检查方案是否是有效的并输出结果。

【函数签名】

def check_doors(n: int, k: int, doors: List[List[int]], opens: List[int]) -> bool:
    pass

【输入】

  • 一个整数 $n ~ (1 \leqslant n \leqslant 100)$,表示门的数量;

  • 一个整数 $k ~ (1 \leqslant k \leqslant 3)$,表示每层门的操作数;

  • 一个 $n \times k$ 的矩阵 $doors$,其中 $doors_{i,j} \in {0,1,2,3}$,表示门 $i$ 上 $j$ 层门的操作,其中 0 表示略过该门。

  • 一个长为 n 的列表 $opens$,其中 $opens_i \in {0,1}$,表示门 $i$ 是否初始处于打开状态。

【输出】

  • 如果方案是有效的,返回 $\texttt{True}$,否则返回 $\texttt{False}$。

【样例输入/输出】

样例一:

输入:
n = 2
k = 2
doors = [[1, 2], [0, 2]]
opens = [1,0]
输出:
True
解释:门 0 的初始状态为打开。第一层门的操作是 $\texttt{XOR}$,因此门 0 变为关闭状态。第二层门的操作是 $\texttt{OPEN}$,因此门 0 再次变为打开状态。门 1 的初始状态是关闭的。第二层门的操作是 $\texttt{OPEN}$,因此门 1 变为打开状态。

样例二:

输入:
n = 2
k = 2
doors = [[1, 2], [0, 2]]
opens = [0,0]
输出:
False
解释:门 0 的初始状态为关闭状态。第一层门的操作是 $\texttt{XOR}$,因此门 0 变为打开状态。第二层门的操作是 $\texttt{OPEN}$,因此门 0 变为打开状态。因此,开锁方案是无效的。

【注意】

  • 本题输入输出型题目,无需实现函数。

  • 请返回按 markdown 格式书写的描述内容。

解答

这是一道输入输出型题目,需要注意数据类型与返回值类型。具体来说,本题我们需要从输入中得到 n 个门的控制方法、状态,并输出其是否能被正常开锁。

对于这一问题,我们可以根据题目描述模拟操作。具体来说,我们可以首先将门的状态初始化为输入的 opens 列表中的状态,然后对于每一种门控制方式进行对应操作,即对于 $\texttt{XOR}$、$\texttt{NOT}$、$\texttt{OPEN}$、$\texttt{CLOSE}$ 分别进行根据题意进行判断与设置即可。最后,我们判断所有门的状态是否均为打开状态,如果是,则说明该开锁方案有效,返回 $\texttt{True}$ 即可;否则,说明开锁方案无效,返回 $\texttt{False}$ 即可。

代码如下:

def check_doors(n: int, k: int, doors: List[List[int]], opens: List[int]) -> bool:
    # 初始化门的状态
    locks = opens.copy()
    # 遍历每个门的控制方式进行操作
    for j in range(k):
        for i in range(n):
            if doors[i][j] == 1:  # XOR
                locks[i] ^= 1
            elif doors[i][j] == 2:  # NOT
                locks[i] = 1 - locks[i]
            elif doors[i][j] == 3:  # OPEN
                locks[i] = 1
            elif doors[i][j] == 4:  # CLOSE
                locks[i] = 0
    # 判断全部门是否全部打开
    return all(locks)

其中,我们首先实现了 check_doors 函数,该函数接收 n 个门的数量、每个门的控制方式数量 k、控制方式矩阵 doors 以及初始门状态列表 opens,返回开锁方案是否有效的布尔值。

具体来说,我们首先将门的状态初始化为输入的 opens 列表中的状态,然后遍历每个门的控制方式进行操作。具体来说,对于每个门的控制方式,我们根据题意进行对应操作,即对于 $\texttt{XOR}$、$\texttt{NOT}$、$\texttt{OPEN}$、$\texttt{CLOSE}$ 分别进行根据题意进行判断与设置。最后,我们判断所有门的状态是否均为打开状态,如果是,则说明该开锁方案有效,返回 $\texttt{True}$ 即可;否则,说明开锁方案无效,返回 $\texttt{False}$ 即可。

这样,我们就成功实现了该函数,能够正确地进行开锁方案有效性的检查。