📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|问题 14(1)

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

Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|问题 14

题目描述

给定一个开关门的系统,门有三种状态:CLOSED、OPEN、LOCKED。系统初始状态为CLOSED。下面是门的状态转换图:

The door state transition diagram

其中,openclose代表开关门的状态转换函数,参数是一个代表门当前状态的整数。

你需要实现一个模拟门状态转换的函数 door。函数接收两个参数:表示门操作的字符串数组,表示每个操作执行的次数的数组。函数需要模拟出所有的操作结果,并返回一维整数数组,里面包含门每个操作后结束时的状态值,状态值的值分别为0、1、2,分别代表CLOSED、OPEN、LOCKED。

示例
inputs = ["OPEN", "CLOSE", "CLOSE", "OPEN", "LOCK"]
times = [3, 2, 1, 2, 1]
output = door(inputs, times)
print(output)

输出

[1, 0, 0, 1, 2]
解法

这道题目可以通过模拟的方式来实现。首先,我们创建一个变量 current_state 来保存门的当前状态,然后根据输入参数和门状态转换图,模拟出门状态的变化。最后,将门的每次操作结束时的状态值保存到一个数组中作为输出。

需要注意的是,在实现门状态转换的函数 openclose 中,需要判断当前门的状态是否与该操作的前置状态匹配。如果当前门的状态不匹配,则抛出一个异常并终止程序。

代码实现
def door(inputs, times):
    current_state = 0
    output = []

    def openclose(state):
        if current_state == 0 and state == 1:
            current_state = 1
        elif current_state == 1 and state == 0:
            current_state = 0
        elif current_state == 1 and state == 2:
            current_state = 2
        elif current_state == 2 and state == 1:
            current_state = 1
        elif current_state == 2 and state == 0:
            current_state = 0
        else:
            raise Exception("Invalid operation")

    for i, operation in enumerate(inputs):
        for j in range(times[i]):
            if operation == 'OPEN':
                openclose(1)
            elif operation == 'CLOSE':
                openclose(0)
            elif operation == 'LOCK':
                openclose(2)

        output.append(current_state)

    return output

以上是具体解题思路和代码实现,希望对程序员们的刷题之路有所帮助。