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

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

Sudo GATE 2020 Mock III - Question 24

介绍

本题是关于门控的问题,需要根据输入的门控条件来判断是否能进入某个区域,同时还需要判断当前是否有人进入或离开该区域。通过编写程序来实现这个功能,我们可以更加方便地管理区域,提高安全性。

输入

输入包括若干行,每行包括两个整数T和N,T代表当前事件发生的时间(从0开始),N代表事件的类型。如果N为0,则表示有人进入该区域,如果N为1,则表示有人离开该区域。

接下来的T行表示门控条件。第i行表示第i个门控的条件,每个条件为一个由大写字母和|组成的字符串,表示在进入该区域前所必须满足的条件。其中大写字母表示该门控下必须经过的区域,|表示或者关系。例如,字符串"A|B|C"表示必须在经过A、B或C任一个区域后才能进入该区域。

输出

对于每个事件,按照输入的顺序,如果该事件合理,则输出"YES",否则输出"NO"。

解析

从输入可以看出,这是一个有关门控的问题。门控条件需要满足才能进入某个区域,因此我们需要将门控条件解析出来,并存储到数据结构中。之后遇到新的事件,我们只需要判断该事件是否合理即可。

对于每个门控条件,可以使用一个链表来存储。链表中的每个节点存储该门控条件中的一个区域。当遇到新的事件时,我们只需要检查该事件所处的区域是否满足该门控条件即可。

以下是代码片段:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


class LinkedList:
    def __init__(self):
        self.head = None

    def insert(self, data):
        if not self.head:
            self.head = Node(data)
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = Node(data)

    def contains(self, data):
        current = self.head
        while current:
            if current.data == data:
                return True
            current = current.next
        return False


def parse_condition(condition):
    """
    解析门控条件
    """
    linked_list = LinkedList()
    areas = condition.split("|")
    for area in areas:
        linked_list.insert(area)
    return linked_list


def is_valid_event(areas, entered_areas, condition):
    """
    判断事件是否合理
    """
    allowed_areas = set()
    current = condition.head
    while current:
        allowed_areas.add(current.data)
        current = current.next

    for entered_area in entered_areas:
        if entered_area in allowed_areas:
            return True

    for area in areas:
        if area in allowed_areas:
            return True

    return False


def main():
    n = int(input())
    conditions = []
    entered_areas = set()  # 当前进入该区域的人所在的区域
    for i in range(n):
        t, n = map(int, input().split())
        areas = input().strip()

        # 更新已进入该区域的人所在的区域
        if n == 0:
            for area in entered_areas:
                if area != areas:
                    entered_areas.remove(area)
            entered_areas.add(areas)

        # 判断事件是否合理
        if not is_valid_event(areas, entered_areas, conditions[t]):
            print("NO")
            continue

        if n == 0:
            print("YES")
        else:
            print("YES")
            entered_areas.remove(areas)
        conditions.append(parse_condition(areas))

以上代码实现了对门控条件的解析和事件的判断。使用时,只需要调用main()函数即可。