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

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

题目介绍

本题为 Sudo GATE 2020 Mock III(2019 年 1 月 24 日)的第 30 题,题目名称为 “门”。

题目描述

有一个黑匣子,其中有n个开关和m个门。每个门都有一个名字,并且只能由一个或多个开关控制。开关与门之间有以下关系:

每个开关可以控制零个或多个门;每个门可以被零个或多个开关控制。

给定黑匣子中每个开关控制哪些门的信息和每个门被哪些开关控制的信息,您的任务是判断此控制系统的行为,即对于每个开关,它是否能够打开(至少控制一个门),对于每个门,它是否能够打开(至少有一个控制它的开关打开)。

输入格式

输入的第一行包含两个整数n和m,它们分别表示黑匣子中的开关数量和门的数量。 接下来的m行每行描述一个门。每行包含一个字符串s,表示该门的名称,以及一个整数k,表示控制该门的开关个数。紧随其后是k个整数,表示控制该门的开关的编号(1到n)。 接下来的n行每行描述一个开关。每行含有一个整数l和一个l位的01串,表示开关控制的门数量和开关控制每个门的状态。

输出格式

输出包括两个部分。 第一部分包括n行,第 i行描述第 i个开关是否能够打开。如果开关能够打开,则输出"Yes",否则输出"No"。 第二部分包括m行,第 i 行描述第 i 个门是否能够打开。如果门能够打开,则输出"Yes",否则输出"No"。

输入样例

5 5 door1 2 1 2 door2 2 2 3 door3 2 3 4 door4 1 5 door5 1 5 3 010 3 011 2 101 3 010 3 100

输出样例

Yes Yes No Yes No Yes Yes No No Yes

说明

本题的输入和输出均为文本格式。您可以手动输入样例并与输出进行比对,以检查您的程序的正确性。

代码实现

"""
这道题的解题思路是使用集合(set)来处理开关和门的联系,并使用深度优先搜索(DFS)算法进行遍历。
广度优先搜索(BFS)算法同样也可以进行遍历,不过DFS的代码相对更加简洁一些。
"""

n, m = map(int, input().split())

doors = {}
switches = {}

# 处理“门”的数据
for i in range(m):
    name, k, *switch_indices = input().split()
    switch_indices = set(map(int, switch_indices))
    doors[name] = switch_indices
 
# 处理“开关”的数据
for i in range(n):
    l, switch_state = input().split()
    switch_state = set(j + 1 for j in range(len(switch_state)) if switch_state[j] == '1')
    switches[i + 1] = switch_state
 
# 开关是否能够打开门
switches_controling_doors = {}
for switch_index in switches.keys():
    switch_control = set()
    for door_name, door_control in doors.items():
        if switch_index in door_control:
            switch_control.add(door_name)
    switches_controling_doors[switch_index] = switch_control
 
# 门是否能够打开
doors_controlled_by_switches = {}
for door_name, door_control in doors.items():
    door_control_set = set()
    for switch_index in door_control:
        door_control_set |= switches[switch_index]
    doors_controlled_by_switches[door_name] = door_control_set
 
# DFS进行遍历
def dfs_doors_controlled_by_switches(doors_controlled_by_switches, start):
    visited = set()
     
    def dfs(start):
        visited.add(start)
        for next_door in doors_controlled_by_switches[start]:
            if next_door not in visited:
                dfs(next_door)
     
    dfs(start)
     
    return visited
 
for switch_index, switch_control in switches_controling_doors.items():
    if len(dfs_doors_controlled_by_switches(doors_controlled_by_switches, switch_control.pop())) > 0:
        print("Yes")
    else:
        print("No")
 
for door_name, door_control_set in doors_controlled_by_switches.items():
    if len(door_control_set) > 0:
        print("Yes")
    else:
        print("No")