使用Lights Off算法的Python游戏
几年前,我在C++
做过一场游戏。它称为Lights Off
,它在递归中使用Lights Off算法。我尝试用Python
对其进行编码,但是我不确定它是否按照预期的方式出现,而且我想添加零和一的矩阵。这里是方向和输出:
想象一排n
的灯,它们可以在某些条件下打开和关闭,如下所示。第一个灯可以随时打开或关闭。仅当前面的指示灯亮起且之前的所有其他指示灯熄灭时,其他每个指示灯才可以打开或关闭。
如果最初所有指示灯都点亮,那么如何关闭它们呢?对于编号为1 to 3
的三个灯,可以执行以下步骤,其中1
是打开的灯,而0
是关闭的灯:
1 1 1 Initially all on
0 1 1 turn off light 1
0 1 0 turn off light 3
1 1 0 turn on light 1
1 0 0 turn off light 2
0 0 0 turn off light 1
Python代码:
def turnOff(n):
# if number of lights is less than one
if (n < 1):
return
# if number of lights is greater or equal to one
if (n == 1):
print("Turn off light", n)
else:
if(n > 2):
turnOff(n - 2)
print("Turn off light", n)
if(n > 2):
turnOn(n - 2)
turnOff(n - 1)
def turnOn(n):
# if number of lights is less than one
if(n < 1):
return
# if number of lights is 1
if(n == 1):
print("Turn on light", n)
else:
turnOn(n - 1)
if(n > 2):
turnOff(n - 2)
print("Turn on light", n)
if(n > 2):
# call method
turnOn(n - 2)
def main():
n = int(input("Please enter a number of lights: "))
print()
print(turnOn(n))
# print("Number of steps", count)
if __name__ == "__main__":
main()
结果:
Please enter a number of lights: 3
Turn on light 1
Turn off light 1
Turn on light 3
Turn on light 1
我认为输出不正确,并且我想在其中添加零和一的矩阵。
答案 0 :(得分:0)
问题似乎在于您在一开始就调用turnOn
而不是调用turnOff
。另外,您应该使用n > 2
时使用n > 1
。
此外,可以通过删除和合并不必要的if
条件来简化您的代码。请注意,由于您正在打印函数的返回值-不返回任何内容,因此您的代码也会打印None
。
如果要打印灯光矩阵,则可以使用一个列表来表示每次迭代中的灯光并进行打印,可以将该列表作为参数传递给函数。
具有所有这些改进的有效代码将如下所示:
def turnOff(n,lights):
# if number of lights is less than one
if n < 1:
return
# if number of lights is greater or equal to one
if n == 1:
print("Turn off light", n)
lights[n - 1] = 0
print(lights)
else:
turnOff(n - 2, lights)
print("Turn off light", n)
lights[n - 1] = 0
print(lights)
turnOn(n - 2, lights)
turnOff(n - 1, lights)
def turnOn(n, lights):
# if number of lights is less than one
if n < 1:
return
# if number of lights is 1
if n == 1:
print("Turn on light", n)
lights[n - 1] = 1
print(lights)
else:
turnOn(n - 1, lights)
turnOff(n - 2, lights)
print("Turn on light", n)
lights[n - 1] = 1
print(lights)
turnOn(n - 2, lights)
def main():
n = int(input("Please enter a number of lights: "))
print()
lights = [1] * n
print(lights)
turnOff(n, lights)
# print("Number of steps", count)
if __name__ == "__main__":
main()
结果
Please enter a number of lights: 3
[1, 1, 1]
Turn off light 1
[0, 1, 1]
Turn off light 3
[0, 1, 0]
Turn on light 1
[1, 1, 0]
Turn off light 2
[1, 0, 0]
Turn off light 1
[0, 0, 0]
您可以使用join
函数和fstrings
自行格式化输出。