python面试题参考:如下图所示,平面上有一些关键点集,现需要将所有的点连接起来,使得任何一个点都可以和其他点连通(直接或者间接的连接)且连接连接线段长度总和最短

如下图所示,平面上有一些关键点集,现需要将所有的点连接起来,使得任何一个点都可以和其他点连通(直接或者间接的连接)且连接连接线段长度总和最短python面试题参考:如下图所示,平面上有一些关键点集,现需要将所有的点连接起来,使得任何一个点都可以和其他点连通(直接或者间接的连接)且连接连接线段长度总和最短

例:如下图中A、B、C、D四点,连接AB、BC、BD即可满足ABCD四点相互连通,且连接的线段总长度是最短的

python面试题参考:如下图所示,平面上有一些关键点集,现需要将所有的点连接起来,使得任何一个点都可以和其他点连通(直接或者间接的连接)且连接连接线段长度总和最短

请完善以下方法,完成以上功能。

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)