想象一下n行灯只能在某些条件下打开或关闭,如下所示。第一盏灯可以随时打开或关闭。只有当前一盏灯亮起且其前所有其他灯熄灭时,才能打开或关闭其他每盏灯。关闭3个灯的示例如下:
111
011
010
110
100
000
我获得了turnOff()的算法,我想提出打开算法。
turnOff(n)
if(n = 1) turn off light 1
else {
if(n>2) turnOff(n-2)
turn off light n
if(n>2) turnOn(n-2)
turnOff(n-1)
}
我试着编写打开灯的算法,并想出了以下内容:
turnOn(n)
if(n=1) turn on light 1
else{
if(n>2) turnOn(n-1)
turn on n-1
if(n>2) turnOff(n-2)
turn on n
}
但它不起作用。我不知道如何递归思考。我不知道我想要做些什么来解决它。
我的turnOn(3)给出了以下输出:
答案 0 :(得分:1)
以下是打开奇数和偶数灯的测试用例:
3灯:
000
100
110
010
011
111
4灯:
0000
1000
1100
0100
0110
1110
1010
0010
0011
1011
1111
开启的算法:
我们的第一个目标始终是打开最后一盏灯。一旦它开启,我们就可以前进了。现在它。一旦最后一盏灯亮起,聪明的决定就不会在最后一盏灯前关灯。
通过这种方式,我们一次可以从尾端打开2个灯。
如果你有一定数量的灯,一次重复,你就可以打开k = 2灯,现在剩下n-k个灯。只要n-k = 0/1
,就重复这些n-k灯的过程如果n-k = 0,您的任务就完成了,所有灯都亮了。
问题:
如果n-k = 1,你会怎么做?很容易,只是想猜!