一个送外卖的男孩有一系列的订单要送。这些订单的目的地用
坐标{𝑝1, 𝑝2, … , 𝑝𝑛}来表示,p𝑖 = (𝑥𝑖, 𝑦𝑖)。假设 x 坐标是严格递增的,即
𝑥1 < 𝑥2 < ⋯ 𝑥𝑛。外卖店的位置在𝑝1,并且送外卖的路线满足两个约束条
件:首先按照 x 坐标递增的顺序送外卖,然后按照 x 递减的顺序送外卖
并且最终回到外卖店。假设已有函数 dist(i,j)用来计算p𝑖和pj之间的距离,请给出计算最短外卖路线的算法。
关于#送外卖#的问题,如何解决?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 假设订单目的地坐标按照x坐标递增的顺序组成列表(或数组)[p1, p2, p3, ...,pn-1, pn],那计算路线距离就相当于从列表中挑出p1到pn的不同点,加上列表中剩下的点之间的距离之和。
举个例子,例子中输出的结果,相当于从上面的列表中挑出了p1, p2, p6, p7, p8, p10,则送买卖的距离之和为dist(p1,p2)+dist(p2,p6)+dist(p6,p7)+dist(p7+p8)+dist(p8,p10),用distA表示。而剩下的点加上外卖店和最远点,为p1, p3, p4, p5, p9, p10,代表返回外卖店的距离是dist(p1,p3)+dist(p3,p4)+dist(p4,p5)+dist(p5+p9)+dist(p9,p10),用distB表示。
所以,题目可以转化成,从列表中挑出哪些点,得到的distA+distB最短。所有的可能性是2的n-2次方,逐个比较即可。
下面是以python为例,找出所有可能路线的递归解法:def findpath(loc,path): if len(loc)==0: return [path] all_path = [] for i in range(len(loc)): all_path += findpath(loc[i+1:],path+[loc[i]]) return all_path p = [1,2,3,4,5,6,7,8,9,10] all_path=findpath(p[1:],[1])
解决 3无用
悬赏问题
- ¥15 如何在scanpy上做差异基因和通路富集?
- ¥20 关于#硬件工程#的问题,请各位专家解答!
- ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
- ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
- ¥30 截图中的mathematics程序转换成matlab
- ¥15 动力学代码报错,维度不匹配
- ¥15 Power query添加列问题
- ¥50 Kubernetes&Fission&Eleasticsearch
- ¥15 報錯:Person is not mapped,如何解決?
- ¥15 c++头文件不能识别CDialog