我正在尝试制作一种算法来创建矩阵P,对于NxN网格,所有具有都用值X(在矩阵P中(注释。
例如,我有一个 3x3 网格:
0 1 2
3 4 5
6 7 8
(0( 的邻居是 (1( 和 (3(。(7(的邻居是(4(、(6(和8等。因此,矩阵 P 应转换为:
[1, X, 0, 0, 0, 0, 0, 0, 0],
[X, 1, X, 0, X, 0, 0, 0, 0],
[0, X, 1, 0, 0, X, 0, 0, 0],
[X, 0, 0, 1, X, 0, X, 0, 0],
[0, X, 0, X, 1, X, 0, X, 0],
[0, 0, X, 0, X, 1, 0, 0, X],
[0, 0, 0, X, 0, 0, 1, X, 0],
[0, 0, 0, 0, X, 0, X, 1, X],
[0, 0, 0, 0, 0, X, 0, X, 1],
我让它在 1D 中工作:
for i in range(N):
for j in range(N):
if i == j:
p[i][j] = 1
else:
if j + 1 == i:
p[i][j] = X
elif j - 1 == i:
p[i][j] = X
但是,我毫无头绪地试图将其转换为 2D 方式。有谁知道如何做到这一点?
P 中的每个"行">
实际上代表 3x3 网格中的"行"和"col"。要从 P 中的行号转换为网格坐标,需要两行代码:
current_row = i // N
current_col = i % N
第一行是整数除法,这意味着它向下舍入到最接近的整数。第二行使用取模运算符,这是除以i
时的余数N
。
同样,P 中的每个"col"都转换为other_row
并在 3x3 网格中other_col
。
一旦知道行和列,其余代码就非常简单了:
N = 3
p = [['0' for col in range(N*N)] for row in range(N*N)]
for i in range(N*N):
for j in range(N*N):
current_row = i // N
current_col = i % N
other_row = j // N
other_col = j % N
if current_row == other_row and current_col == other_col:
p[i][j] = '1'
elif current_row == other_row and abs(current_col - other_col) == 1:
p[i][j] = 'X'
elif current_col == other_col and abs(current_row - other_row) == 1:
p[i][j] = 'X'
for i in range(N*N):
for j in range(N*N):
print p[i][j],
print