关于观星的python算法,大家自取

06/2770 浏览攻略
import copy
def solve_puzzle(graph, init_state):
    n = len(init_state)
    # 构建增广矩阵(布尔方程组)
    matrix = []
    for j in range(n):
        row = graph[j].copy()  # 系数矩阵
        row.append(1 ^ init_state[j])  # 常数项:1 - 初始状态
        matrix.append(row)
   
    # 高斯消元解布尔方程组
    click = [0] * n
    for col in range(n):
        # 寻找主元行
        pivot = -1
        for row in range(col, n):
            if matrix[row][col] == 1:
                pivot = row
                break
        if pivot == -1:
            continue  # 自由变量,可设为0
       
        # 交换主元行到当前列
        matrix[col], matrix[pivot] = matrix[pivot], matrix[col]
       
        # 消去其他行的当前列
        for row in range(n):
            if row != col and matrix[row][col] == 1:
                for c in range(col, n + 1):
                    matrix[row][c] ^= matrix[col][c]
   
    # 回代求解
    for i in range(n):
        if matrix[i][i] == 1:
            click[i] = matrix[i][n]
   
    return click
graph = [
    [1,1,0,0,0,0,0,1,1],#节点1
    [1,1,1,0,0,0,0,0,0],#节点2
    [0,1,1,1,0,0,1,0,0],#节点3
    [0,0,1,1,1,0,0,0,1],#节点4
    [0,0,0,1,1,1,1,0,0],#节点5
    [0,0,0,0,1,1,1,1,1],#节点6
    [0,0,1,0,1,1,1,1,0],#节点7
    [1,0,0,0,0,1,1,1,1],#节点8
    [1,0,0,1,0,1,0,1,1],#节点9
]
init_state = [0,0,1,0,0,0,0,1,0]#各节点亮灭
print(solve_puzzle(graph,init_state))
#输出结果中0不点击1点击
6
1