点灯游戏(文曲星中的开窗)是一个十分有趣的智力游戏,他的规则是这样的:有一行N行N列的灯,开始时全部是灭的,你点击其中一盏灯是他的上下左右(若存在的话)状态全部改变,现在要求你在限定的时间内以最少地步数,将全部的灯点亮.
现在,我们以某一盏灯为研究对象,显然,当此灯状态被改变奇数次后,灯被点亮.反之,被点击偶数次,灯则维持原来的熄灭状态不变.而促使灯状态改变的事件不外乎其上下左右(若存在的话)被点击.推而广之,只要所有的灯状态被改变奇数次,则可保证所有的灯全部被点亮.同时,应该,说明的是,对每一盏灯来说,自身被点次奇数数与一次效果相同,这是因为,对每盏灯来说,被点一次后,再点偶数次,自身他的上下左右(若存在的话)状态恢复原态.同样道理,自身被点偶数次,相当于没被点.
故在最少步数的限制下,每盏灯要么没被点,要么仅被点一次.
我们很容易想到,可以用枚举的方法来解决问题,全局枚举的最大缺点是:循环次数太多,使N*N次,随着N次数地增加,执行时间加长.为此又提出一种改进算法:我们知道对每一盏灯而言,每盏灯的状态改变次数仅与其上下左右(若存在的话)和自身被点次数有关.这样我们就可以对第一行利用枚举法.列出其所有的可能值.