[笔记][中国大学mooc][程序设计与算法(二) 算法基础][枚举][局部枚举法] POJ1222 熄灯问题
题目 分析 按照一般的穷举法,一共有30个开关,所以解空间有 2 30 2^{30} 2 3 0 个可能,需要减少枚举数目: 如果存在某个局部,一旦这个局部的状态被确定,那么剩余其他部分的状态只能是确定的一种,或者不多的n种,那么就只需枚举这个局部的状态即可 对于本题目,第一行开关按下的状态可以决定剩余所有的状态,将解空间大小缩小为 2 5 2^{5} 2 5 代码 # include <stdio.h> int solve ( char puzzle [ ] [ 6 ] , char result [ ] [ 6 ] ) { int cnt1 , cnt2 ; for ( cnt1 = 1 ; cnt1 < 5 ; cnt1 ++ ) { for ( cnt2 = 0 ; cnt2 < 6 ; cnt2 ++ ) { if ( puzzle [ cnt1 - 1 ] [ cnt2 ] == 1 ) { result [ cnt1 ] [ cnt2 ] = 1 ; puzzle [ cnt1 - 1 ] [ cnt2 ] = ! puzzle [ cnt1 - 1 ] [ cnt2 ] ; puzzle [ cnt1 ] [ cnt2 ] = ! puzzle [ cnt1 ] [ cnt2 ] ; if ( cnt1 + 1 < 5 ) puzzle [ cnt1 + 1 ] [