我就10*10方阵,谈谈最少步编程解题思路:
1. 建立坐标,F(n,m)表示第n行第m列的灯的状态,0表示灭,1表示亮。
2. 用 S(n,m)表示对 第n行第m列的灯是否进行点灯操作,0表示不操作,1表示操作1次。(最少步数,不可能对同一个灯进行2次以上的操作,因为点2次和不点对整个灯的状态是没有影响)。
3. 根据所有灯的初始状态,设置F(n,m)的初始值。
4. 先对第一行 S(1,m)的值进行穷举( 比如采用10位2进制数,从0000000000开始逐渐穷举到1111111111),计算F(1,m)= F(1,m)+S(1,m)+S(1,m+1)+S(1,m-1)。这样为了使第一行的F(1,m)都等于1,S(2,m)的值唯一确定,S(2,m)确定后,F(2,m)的值也确定,接着确定S(3,m)......
最后若F(10,m)都等于1,那么就得到点灯的整个方案:
S(1,1) S(1,2) S(1,3) S(1,4) S(1,5) S(1,6) S(1,7) S(1,8) S(1,9) S(1,10)
S(2,1) S(2,2) S(2,3) S(2,4) S(2,5) S(2,6) S(2,7) S(2,8) S(2,9) S(2,10)
S(3,1) S(3,2) S(3,3) S(3,4) S(3,5) S(3,6) S(3,7) S(3,8) S(3,9) S(3,10)
S(4,1) S(4,2) S(4,3) S(4,4) S(4,5) S(4,6) S(4,7) S(4,8) S(4,9) S(4,10)
S(5,1) S(5,2) S(5,3) S(5,4) S(5,5) S(5,6) S(5,7) S(5,8) S(5,9) S(5,10)
S(6,1) S(6,2) S(6,3) S(6,4) S(6,5) S(6,6) S(6,7) S(6,8) S(6,9) S(6,10)
S(7,1) S(7,2) S(7,3) S(7,4) S(7,5) S(7,6) S(7,7) S(7,8) S(7,9) S(7,10)
S(8,1) S(8,2) S(8,3) S(8,4) S(8,5) S(8,6) S(8,7) S(8,8) S(8,9) S(8,10)
S(9,1) S(9,2) S(9,3) S(9,4) S(9,5) S(9,6) S(9,7) S(9,8) S(9,9) S(9,10)
S(10,1) S(10,2) S(10,3) S(10,4) S(10,5) S(10,6) S(10,7) S(10,8) S(10,9) S(10,10) |