📜  拼图 |光环

📅  最后修改于: 2021-10-23 07:30:51             🧑  作者: Mango

有一圈N > 2 个灯,每个灯旁边都有一个开关。每个开关可以在两个位置之间翻转,从而切换三个灯的开/关状态:它自己的灯和与其相邻的两个灯。最初,所有灯都熄灭。设计一种算法,通过翻转最少数量的开关来打开所有灯。

解决方案:
由于最初所有的灯都是关闭的,很明显,灯的最终状态仅取决于每个开关翻转次数的奇偶性(奇数或偶数),而不取决于操作开关的顺序.要打开一盏灯,我们可以拨动它的开关并关闭相邻的开关,或者我们拨动所有三个开关,对于一组三个灯。假设灯按顺时针顺序从 1 到 N编号,我们有两种情况。

  1. N是在3整除:在这种情况下,我们翻转开关为1灯泡,其点亮灯泡1,2和N。然后我们拨动4 个灯泡的开关,它点亮了灯泡3、4 和 5 。以这种方式,我们每拨动3K + 1 个灯泡的开关,直到拨动N-2 个灯泡的开关,这将点亮最后 3 个灯泡。这导致总共N/3 次开关翻转。
  2. N 不能被 3 整除:在这种情况下,假设我们遵循与上述相同的程序。这只会以 3 的倍数打开灯泡。所以最后会有一两个灯泡熄灭。拨动这些灯泡之一的开关,我们至少关掉一个灯泡。这个灯泡,比如说 X ,由于前一次翻转而现在已经熄灭了偶数次,要打开它,需要翻转 X或其相邻灯泡之一的开关,但没有翻转.这样,我们必须翻转每个开关尚未翻转的灯泡的开关。这导致总共N 次开关翻转。