在传统的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
我有一个完全的大脑冻结适应我的变种,有人可以帮助我吗?
答案 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