📜  门| Gate IT 2005 |问题16(1)

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

问题16 - 门问题

题目描述

有$$n$$扇门排成一个圆圈,每扇门都可以被打开或关闭。起初,所有门都是关闭的。有$$n$$个人,第1个人从第1扇门开始逆时针打开每个门。接下来,第2个人从第2扇门开始顺时针(逆时针是接下来的方向)跳过他当前所在的已关闭的门并打开下一个门;第3个人从第3扇门开始逆时针跳过已关闭的门并打开下一个门;第4个人从第4扇门开始顺时针跳过已关闭的门并打开下一个门……一直进行,直到所有人都完成操作为止。此时,圆圈中哪些门是打开的?

输入格式

输入一个整数$$n(1<=n<=1000)$$,表示门的数量。

输出格式

按照门的编号从小到大的顺序,输出哪些门是开着的。每个数字之间有一个空格,行末没有空格。

样例输入
5
样例输出
1 3 5
解题思路

本题可以使用模拟的方式解决。创建一个长度为$$n$$,所有元素值均为0的列表,表示所有门都是关闭的。接下来,按照题目要求模拟人的遍历操作,并将经过的门编号的列表值翻转并赋值为1。最后将列表中的值为1的元素编号输出即可。

代码实现
n = int(input()) # 读入门的数量
doors = [0]*n # 初始化门的列表,全部为关闭状态

# 模拟人的遍历操作
for i in range(1, n+1):
    step = i # 步长
    curr_pos = i-1 # 当前位置
    while doors[curr_pos] != 0: # 当前门已经打开,继续向前
        curr_pos = (curr_pos + step) % n # 模拟环形
    doors[curr_pos] = 1 # 打开对应的门

# 输出打开的门的编号
res = []
for i in range(n):
    if doors[i] == 1:
        res.append(str(i+1)) # 从1开始编号
print(' '.join(res))

该代码在输入$$n$$为5的情况下,输出为:

1 3 5