<返回更多

Python算法之熄灯问题

2022-05-11  今日头条  小汪学python
加入收藏

问题:有一个5X6的灯矩阵,灯按一下就亮,再按一下就熄灭。现在有这样一种情况,在这个矩阵中任意按下一盏灯它本身以及它的上、下、左、右四个位置的灯的状态也会随之改变。

例如:红色表示灯亮,白色表示灯熄灭。假设在开始时,所有的灯都是亮的,当我们按下(1,1)位置的灯,灯的状态会发生如下图变化;当我们又按下(2,5)位置的灯后,它附近的会发生如下图的变化。

Python算法之熄灯问题

 

代码:

import numpy as np

line = [[0] * 6] * 5

for 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的最上面加入一行0
puzzle = np.insert(puzzle, 0, values=zero, axis=0)

# 在puzzle的最后一列加入一列0
puzzle = np.insert(puzzle, 6, values=zero, axis=1)

# 在puzzle的第0列加入一行0
puzzle = 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]) % 2
    for 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 0
    return 1


def enumeration():
    while guess() == 0:
        press[1][1] += 1
        c = 1
        while (press[1][c] > 1):
            press[1][c] = 0
            c += 1
            press[1][c] += 1
        continue


enumeration()
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]]
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>