Python练习 | 查找坐标点之间最短的路径

题目名称:查找坐标点之间最短的路径

时间限制:1000ms

内存限制:256M

题目描述:

给定十个坐标点{{1, 1}, {1, 3}, {2, 2}, {4, 4}, {2, -2},{3, -1}, {-2, 2}, {-3, 4}, {-1, -2}, {-3, -3}},下标分别为0-9. 随机选择n个坐标点,n>=2,n<=10,找出遍历n个坐标点最近的路径。

输入描述:

1、先提示输入坐标点的总个数

2、依次输入n个坐标点,注意请输入不重复的坐标点,0<=坐标点<=9

输出描述:

输出一个数组,显示输入的n个坐标点遍历的最短路径。

示例 

输入:

4
1
2
3
4

输出:

[4, 2, 1, 3]

'''输入参数'''
n=int(input(""))  # n>=2 and n<=10
m=[]
for i in range(n):
    a=int(input(""))  # 0<=a<=9
    m.append(a)

'''存储十个坐标点的横坐标数组a和纵坐标数组b'''
a=[1,1,2,4,2,3,-2,-3,-1,-3]
b=[1,3,2,4,-2,-1,2,4,-2,-3]

'''挑选出选中坐标点的横坐标数组p和纵坐标数组q'''
p=[a[i] for i in m]
q=[b[i] for i in m]

'''求解各个点之间的距离的平方'''
s=[]
for i in range(n):
    t=[]
    for j in range(n):
        ls=(p[j]-p[i])**2+(q[j]-q[i])**2
        t.append(ls)
    s.append(t)

'''寻找遍历选中的n个坐标点的最短路径'''
num_list = [i for i in range(n)]

#排列组合函数
def permute(nums):
    from functools import reduce
    result = [list(i) for i in
              reduce(lambda x, y: [str(a) + str(b) for a in x for b in y if str(b) not in str(a)], [nums] * len(nums))]
    return result

#求解排列组合个数的函数
def factorial(n):
    sum=n
    for i in range(n-1,0,-1):
        sum=sum*i
    return sum

#得到所有的排列组合
lt=permute(num_list)
for i in range(factorial(n)):
    for j in range(n):
        lt[i][j]=int(lt[i][j])

#求解各个排列组合下的路径距离平方之和
x=[]
for i in lt:
    x0=0
    for j in range(n-1):
        u=i[j]
        v=i[j+1]
        x0=x0+s[u][v]
    x.append(x0)

#寻找最小路径的排列组合
xmin=x[0]
xn=0
for i in range(len(x)):
    if x[i]<=xmin:
        xmin=x[i]
        xn=i

#得到最小路径
g=[]
h=lt[xn]
for i in h:
    y=m[i]
    g.append(y)
print(g)

你可能感兴趣的:(python,算法,数据结构,学习,python,排序算法)