我想我會檢查矩陣中的每個點,並根據它的鄰居找出它的質量。點的質量會隨着距離的平方而下降。然後你可以選擇距離彼此最小的前四個點。
下面是一些Python代碼,我一起試着說明找出每個點的質量的方法。
matrix = [[1.0 if x == "X" else 0.0 for x in y] for y in """.XX......
.XXX..X..
.....XXX.
......X..
.XX......
.X.......
.X.......
....XX...
....XX...""".split("\n")]
HEIGHT = len(matrix)
WIDTH = len(matrix[0])
Y_RADIUS = HEIGHT/2
X_RADIUS = WIDTH/2
要計算質量對於給定的點:
def distance(x1, y1, x2, y2):
'Manhattan distance http://en.wikipedia.org/wiki/Manhattan_distance'
return abs(y1 - y2) + abs(x1 - x2)
def mass(m, x, y):
_mass = m[y][x]
for _y in range(max(0, y - Y_RADIUS), min(HEIGHT, y + Y_RADIUS)):
for _x in range(max(0, x - X_RADIUS), min(WIDTH, x + X_RADIUS)):
d = max(1, distance(x, y, _x, _y))
_mass += m[_y][_x]/(d * d)
return _mass
注:我使用Manhattan距離(又名Cityblock,又名出租車幾何)在這裏,因爲我不使用你的榜樣矩陣一些設置認爲使用歐幾里德距離的附加精度值得調用sqrt()的代價。
迭代通過我們的矩陣和建立一個元組列表像(X,Y,質量(X,Y)):
point_mass = []
for y in range(0, HEIGHT):
for x in range(0, WIDTH):
point_mass.append((x, y, mass(matrix, x, y)))
排序的質量對每個點的地址列表:
from operator import itemgetter
point_mass.sort(key=itemgetter(2), reverse=True)
望着在排序列表頂部9點:
(6, 2, 6.1580555555555554)
(2, 1, 5.4861111111111107)
(1, 1, 4.6736111111111107)
(1, 4, 4.5938888888888885)
(2, 0, 4.54)
(4, 7, 4.4480555555555554)
(1, 5, 4.4480555555555554)
(5, 7, 4.4059637188208614)
(4, 8, 4.3659637188208613)
如果我們將努力從最高到最低,並過濾接[R遠點過於接近已經看到了,我們會得到點(我做手工,因爲我已經用完了時間,現在做在代碼中...):
(6, 2, 6.1580555555555554)
(2, 1, 5.4861111111111107)
(1, 4, 4.5938888888888885)
(4, 7, 4.4480555555555554)
哪個一個非常直觀的結果,只需查看矩陣(請注意,與您的示例進行比較時,座標爲零)。