Python算法之熄灯问题

问题:有一个5X6的灯矩阵,灯按一下就亮,再按一下就熄灭 。现在有这样一种情况,在这个矩阵中任意按下一盏灯它本身以及它的上、下、左、右四个位置的灯的状态也会随之改变 。
例如:红色表示灯亮,白色表示灯熄灭 。假设在开始时,所有的灯都是亮的,当我们按下(1,1)位置的灯,灯的状态会发生如下图变化;当我们又按下(2,5)位置的灯后,它附近的会发生如下图的变化 。

Python算法之熄灯问题

文章插图
 
代码:
import numpy as npline = [[0] * 6] * 5for i in range(5):line[i] = input('请输入第' + str(i) + '行:').split(',')# 将line中的元素转为整型line[i] = list(map(int, line[i]))puzzle = np.array(line)zero = np.zeros(6)# 在puzzle的最上面加入一行0puzzle = np.insert(puzzle, 0, values=zero, axis=0)# 在puzzle的最后一列加入一列0puzzle = np.insert(puzzle, 6, values=zero, axis=1)# 在puzzle的第0列加入一行0puzzle = np.insert(puzzle, 0, values=zero, axis=1)b = [[0 for col in range(8)] for row in range(6)]press = np.array(b)def guess():for r in range(1, 5):for c in range(1, 7):press[r + 1][c] = (puzzle[r][c] + press[r][c] + press[r - 1][c] +press[r][c - 1] + press[r][c + 1]) % 2for c in range(1, 7):if (press[5][c - 1] + puzzle[5][c] + press[5][c + 1] + press[4][c]) % 2 != puzzle[5][c]:return 0return 1def enumeration():while guess() == 0:press[1][1] += 1c = 1while (press[1][c] > 1):press[1][c] = 0c += 1press[1][c] += 1continueenumeration()print("灯的初始状态:n", puzzle[1:6, 1:7])print("按下结果为:n", puzzle[1:6, 1:7])运行结果:
请输入第0行:1,1,0,0,1,1请输入第1行:0,1,0,0,1,0请输入第2行:1,1,1,0,0,0请输入第3行:1,0,1,1,0,1请输入第4行:0,0,0,1,1,1灯的初始状态: [[1 1 0 0 1 1] [0 1 0 0 1 0] [1 1 1 0 0 0] [1 0 1 1 0 1] [0 0 0 1 1 1]]按下结果为: [[1 1 0 0 1 1] [0 1 0 0 1 0] [1 1 1 0 0 0] [1 0 1 1 0 1] [0 0 0 1 1 1]]
【Python算法之熄灯问题】


    推荐阅读