有一个N> 2灯的圆圈,每个灯旁边都有一个开关。每个开关可以在两个位置之间切换,从而切换三个灯的开/关状态:三个灯的开关状态和与其相邻的两个灯的开关状态。最初,所有指示灯均熄灭。设计一种算法,通过翻转最少数量的开关来打开所有灯。
解决方案:
由于所有的灯最初都是关闭的,因此很明显,灯的最终状态仅取决于每个开关被翻转的次数的奇偶性(奇数或偶数),而不取决于开关被操纵的顺序。 。要打开灯,我们可以翻转其开关并保持相邻开关的关闭状态,也可以翻转所有三个开关,以组成一组三个灯。假设灯按顺时针顺序从1到N编号,我们有两种情况。
- N在3中是可分的:在这种情况下,我们翻转第一个灯泡的开关,这将点亮灯泡1、2和N。然后,我们拨动第4个灯泡的开关,它点亮灯泡3、4和5 。以这种方式,我们翻转每个3K + 1灯泡的开关,直到翻转N – 2灯泡的开关,这将点亮最后3个灯泡。这导致总共N / 3个开关翻转。
- N不能被3整除:在这种情况下,假设我们遵循与上述相同的过程。这只会以3的倍数打开灯泡。因此,最后会有一个或两个灯泡熄灭。翻转其中一个灯泡的开关,我们关闭至少一个灯泡。这个灯泡,例如X ,由于之前的翻转已经熄灭,已经翻转了偶数次,要打开它,需要翻转X或未翻转的相邻灯泡之一的开关。这样,我们必须翻转未翻转开关的每个灯泡的开关。这导致总共N次开关翻转。