生成“Lights out”变体的切换矩阵

时间:2014-12-06 21:37:17

标签: python algorithm matrix

在传统的3x3熄灯游戏中,最左上角字段的切换矩阵如下所示:

1 1 0
1 0 0
0 0 0

这意味着,当我们按下第一个按钮时,只有它自己的按钮和它旁边的灯光被切换。在我的变体中,一个按钮的切换矩阵看起来像

1 1 1
1 0 0
1 0 0

切换同一行和每列中的每个灯光。为了有效地解决这个问题,生成了一个n ^ 2 x n ^ 2矩阵,一个按钮的切换矩阵被转换为一个带有row-major order的向量并附加到该矩阵:

1 1 0 1 0 0 0 0 0 <-- this is the example matrix
1 1 1 0 1 0 0 0 0
0 1 1 0 0 1 0 0 0
1 0 0 1 1 0 1 0 0
0 1 0 1 1 1 0 1 0
0 0 1 0 1 1 0 0 1
0 0 0 1 0 0 1 1 0
0 0 0 0 1 0 1 1 1
0 0 0 0 0 1 0 1 1

对于我的变体,它看起来像

1 1 1 1 0 0 1 0 0
1 1 1 0 1 0 0 1 0
1 1 1 0 0 1 0 0 1 
1 0 0 1 1 1 1 0 0
0 1 0 1 1 1 0 1 0
0 0 1 1 1 1 0 0 0
1 0 0 1 0 0 1 1 1
0 1 0 0 1 0 1 1 1
0 0 1 0 0 1 1 1 1

this lecture(第6页)中,它们生成与此类似的矩阵(适用于纯python):

def GenerateToggleMatrix(n):
    result = []

    for i in range(n*n):
        row = [0]*n*n
        result.append(row)

    for i in range(n):
        for j in range(n):

            col = n*i+j            #row-major
            result[col][col] = 1

            if i > 0:   result[col][col-n] = 1
            if i < n-1: result[col][col+n] = 1
            if j > 0:   result[col][col-1] = 1
            if j < n-1: result[col][col+1] = 1
    return result

我有一个完全的大脑冻结适应我的变种,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

只需使用循环来更改同一行或列中的所有元素。

即。改变:

        if i > 0:   result[col][col-n] = 1
        if i < n-1: result[col][col+n] = 1
        if j > 0:   result[col][col-1] = 1
        if j < n-1: result[col][col+1] = 1

        for k in range(n):
            result[col][n*i+k] = 1
            result[col][n*k+j] = 1