题意
这题可以用搜索,但是肯定会超时,毕竟最多100盏灯,10000次按压。这些可不是小数目,不过我们可以知道,对于每一盏灯,按压两次的效果和不按压的效果是一样的。这样一共才四盏灯,也就是我们只要枚举16种情况就OK了。当然达到目标状态后,我们还得看剩下的次数能否是灯的状态不发生改变。通过观察发现,可以没盏灯两次所有的灯的状态不发生改变,还有就是可以改变1,2,3这三盏灯,所有灯的状态也不会发生改变。然后我们看剩下的灯是不是可以由n个2和m个3(n,m可以为0)相加得到。如果可以的话,那么这个状态就可以,记录下来。最后我们要先排序,由于qsort函数对二维数组排序不熟,所有采用的是冒泡排序,不过这最多也就是16个元素,所以还是很快的。
看了Analysis之后发现可以简化到只考虑前6盏灯,因为LCM(1,2,2,3)=6.也就是开关1影响的是每次加1的灯,相应的2 2 3.所以超过6的都可以由前6盏灯得到。这样的话应该还可以把6位二进制转化成10进制然后用qsort快排一下。输出也好办,一般循环输出前6种状态直到输出n位为止。
相应的可以看nocow上的题解