📜  门|门CS 2011 |第 42 题(1)

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

题目描述:门

有 $n$ 扇门,每扇门上有一个开关。这 $n$ 个开关连成一条直线,第 $i$ 个开关控制着第 $i$ 扇门。当按下一个开关时,它所控制的门及其相邻的门的状态都会改变。也就是说,如果一扇门在按下一个开关前是关闭的,那么按下这个开关后就会变成打开的,反之亦然。

需要你编写一个程序,计算出按下一个门的开关后,所有门的开关状态。

输入格式:

共有 $n$ 行,每行一个字符串 $s_i$,第 $i$ 个字符串表示第 $i$ 扇门的状态,若为 $0$ 则表示关闭,若为 $1$ 则表示打开。

输出格式:

输出一行,表示按下一个门的开关后,所有门的状态。

输入样例:
010
输出样例:
101
思路

根据题目的特点,每次操作只会改变一个位置的状态,所以可以暴力枚举每一个位置,然后依次考虑这个位置对应的开关被按下后它所对应的门及其相邻的门的状态改变。

对于每个位置,若它所在的门原来是关闭的,则按下开关后状态会变成打开的;若原来是打开的,则会变成关闭的。

考虑到边界的情况,可以将数组首尾按环形排列。此外,在题目中要求输出的是按下一个门的开关后,所有门的状态,所以只需要在枚举完所有位置后输出数组即可。

代码片段
s = input()
s = s + s[0] # 首尾相接,形成环
n = len(s)
res = '' # 存储结果

for i in range(1, n):
    if s[i] != s[i-1]: # i位置的开关被按下
        s = s[:i] + str(1 - int(s[i])) + s[i+1:] # i位置的门状态改变
        s = s[:i-1] + str(1 - int(s[i-1])) + s[i:] # i-1位置的门状态改变
        s = s[:i+1] + str(1 - int(s[i+1])) + s[i+2:] # i+1位置的门状态改变

res = s[:-1] # 防止输出重复的门状态
print(res)

以上为Python代码,实现了题目所需的功能。通过将输入读入字符串并转化为环形数组的方式,使得考虑第一个元素后面相邻元素的位置时可以直接用首尾相接的下标访问元素。根据上述思路,枚举每个位置即可得到答案。