📜  门|门模拟 2017 |问题 22(1)

📅  最后修改于: 2023-12-03 14:58:37.831000             🧑  作者: Mango

门|门模拟 2017 |问题 22

该问题涉及到一组门的状态模拟,需要编写程序来模拟开关门的状态。

问题描述

假设有n个门,开始状态都是关闭的,编号分别为1到n。现在要模拟m次操作,每次操作会改变某些门的状态。具体的操作方式如下:

  • 如果门是关闭的,则打开它;
  • 如果门是打开的,则关闭它。

每次操作之后,需要输出当前所有门的状态。

输入格式

第一行是两个整数n和m,表示门的个数和操作的次数。

接下来m行,每行是一个整数k和k个门的编号,表示对这k个门进行操作。

输出格式

m+1行,依次为每次操作后所有门的状态,每个状态占据一行。

示例

输入:

5 3
2 1 2
3 2 4 5
1 3

输出:

1 0 1 0 0
0 0 0 1 1
1 0 1 1 1
0 0 0 1 1
解题思路

根据题目的描述,可知门的初始状态都是关闭的,因此可以使用一个长度为n的列表存储所有门的状态。每次操作时,需要对应修改该列表中的元素。最后,需要输出所有门的状态,即输出该列表。

需要注意的是,为了区分门的状态,可以使用0表示关闭,1表示打开。

下面是Python代码实现:

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

# 初始化所有门的状态,0表示关闭
doors = [0] * n

# 模拟m次操作
for i in range(m):
    operation = list(map(int, input().split()))[1:]
    for j in operation:
        # 开关门
        doors[j-1] = 1 - doors[j-1]
    # 输出当前所有门的状态
    print(*doors)
复杂度分析

该算法的时间复杂度为O(mn),其中n是门的个数,m是操作的次数。每次操作需要对所有门的状态进行判断和修改,因此总共需要进行mn次操作。空间复杂度为O(n),需要存储所有门的状态。