如下图所示,平面上有一些关键点集,现需要将所有的点连接起来,使得任何一个点都可以和其他点连通(直接或者间接的连接)且连接连接线段长度总和最短
例:如下图中A、B、C、D四点,连接AB、BC、BD即可满足ABCD四点相互连通,且连接的线段总长度是最短的
请完善以下方法,完成以上功能。
def point_connect(point_list):
“”"
此方法完成所有点的连接,最终返回连接后的所有线段的list,线段中包含两个点的索引
要求所有线段纸盒最短
例如上图中的A、B、C、D
输入为point_list = [ [0,0], [4,0], [6,-2], [7,4] ]
return返回值为:lines_list = [ [0,1], [1,2], [1,3] ]
表明最短线段总长度为l(0,1) + l(1,2) + l(1,3) = 9 + 2 * 2^(1/2)
注:lines_list[0]为[0,1],表示由point_list中第0、1个点组成的线段
即为线段[ [0,0], [4,0]]
“”"
pass
import math
point_list = [[0,0],[2,2],[2,-2],[-2,2],[-2,-2]]
# point_list = [[0, 0], [4, 0], [6, -2], [7, 4]]
def point_connect(point_list):
# 将point_list中的第一个点集作为(0,0)元素点
home_point_x = point_list[0][0]
home_point_y = point_list[0][1]
for i in point_list:
i[0] = int(i[0]) - int(home_point_x)
i[1] = int(i[1]) - int(home_point_y)
# print(point_list)
line_list = []
line_lenght = 0
for i_, i in enumerate(point_list):
line_n = {}
# 定义变量作为存储最小路径的空间
min_ = 0
for j_, j in enumerate(point_list):
if j != i:
x_ = int(j[0]) - int(i[0])
y_ = int(j[1]) - int(i[1])
line = math.sqrt((x_ * x_) + (y_ * y_))
li_ = []
li_.append(i_)
li_.append(j_)
if min_ == 0:
min_ = line
if line < min_:
min_ = line
line_n[str(line)] = li_
_ = [0,0]
_[0],_[1] = line_n[str(min_)][1],line_n[str(min_)][0]
if _ not in line_list:
line_list.append(line_n[str(min_)])
line_lenght += min_
print(line_list)
print(line_lenght)
return line_list
line_list = point_connect(point_list)
print(line_list)