想象一下,我們有以下 5x5 矩陣,其中填充了 1 到 3 之間的整數。 1 跨對角線。2 是接近 1 的“第二對角線”。3 也是對角線,但矩陣太小而無法正確查看。
1, 2, 3, 2, 1
2, 1, 2, 1, 2
3, 2, 1, 2, 3
2, 1, 2, 1, 2
1, 2, 3, 2, 1
什么簡單的演算法可以在 5x5 或 NxN 中生成這個奇數方陣,其中 N 是奇數?
7x7 的整數最多為 4。
這不是家庭作業。
uj5u.com熱心網友回復:
矩陣中的對角線可以用類似于平面中直線方程的方程來定義。你知道平面中的一條線,如果它不是垂直的,可以用形式的方程表示y = a * x b。
類似地,矩陣中的對角線由(i,j)滿足方程的單元組成i = a * j b。
此外,a是線的定向系數,在對角線的情況下,角度為 45° 的線a必須為 1 或 -1。
現在您只需要確定b每個對角線的引數值。
對于主要的第一對角線(左上-右下),等式是
i = j; 引數是a = 1和b = i - j = 0。對于反轉的第一對角線(左下-右上),等式為
i = N - j - 1;引數是a = -1和b = i j = N - 1。
如果兩條對角線是相鄰的,則b對于這兩個對角線引數必須正好1.因此,例如不同,該第二對角線將具有b在{-1, 1, N, N-2}; 第三對角線將有bin{-2, 2, N 1, N-3}等。
每個單元格都在兩條對角線的交點處。由于b總是可以計算i-j為upperleft-bottomright對角線,并i j在bottomleft-upperright對角線,我們不難發現,我們是在通過計算這兩條對角線i-j和i j。然后,由于您想用與最靠近中心的對角線對應的數字填充單元格,請使用min選擇兩條對角線中的哪一條相關。
我們得到以下演算法:
for (i = 0; i < N; i )
for (j = 0; j < N; j )
M(i,j) = min(abs(i-j), abs(i j - (N-1))) 1
python3中的插圖:
def f(i,j, N):
return min(abs(i-j), abs(i j - (N-1))) 1
def M(N):
return [[f(i,j,N) for j in range(N)] for i in range(N)]
print(M(3))
#[[1, 2, 1],
# [2, 1, 2],
# [1, 2, 1]]
print(M(7))
#[[1, 2, 3, 4, 3, 2, 1],
# [2, 1, 2, 3, 2, 1, 2],
# [3, 2, 1, 2, 1, 2, 3],
# [4, 3, 2, 1, 2, 3, 4],
# [3, 2, 1, 2, 1, 2, 3],
# [2, 1, 2, 3, 2, 1, 2],
# [1, 2, 3, 4, 3, 2, 1]]
uj5u.com熱心網友回復:
好的,這次明白了……
嘗試這個:
CellValue[x,y] = MIN(ABS(x-y), ABS(N-(x y) 1)) 1
這是假設一個基于 1 的矩陣。如果您使用的是從零開始的陣列。那么你將不得不調整它
CellValue[x,y] = MIN(ABS(x-y), ABS(N-(x y)-1)) 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362842.html
下一篇:Python回圈隨機整數函式
