PizzaDelivery

来源:互联网 发布:淘宝店铺装修图片尺寸 编辑:程序博客网 时间:2024/06/09 20:01

快餐公司坐落于一个矩形小区内,小区由若干小方格组成,每个方格内,或者是写字楼,或者是景观地貌。快餐公司只有两个送货员,他们每天中午都要在小区内往返送披萨送给写字楼客户,每人每次只能送一幢写字楼。送货员发现,每次从一个方格到另一个方格,会消耗时间如下:如果相邻方格内都是景观地貌,高度差为0则花1分钟,高度差为1则花3分钟,其他高度差则无法通过;如果有一个方格是写字楼,则花2分钟(快餐公司也坐落在某写字楼内),请为送货员设计最佳的送货流程,返回最后一份披萨送达客户的最快时间;如果无法完成任务,则返回-1。

 

示例:小区示意图由字符串数组构成,第i行第j列字母表示对应方格内的布局,如果字符为数字,则表示高度;如果为X,则表示快餐公司所在写字楼;如果为$,则表示需要送达披萨的写字楼。如:

"3442211",

"34$221X",

"3442211"

则最后一个披萨最短送达时间为8分钟,依次消耗时间2+3+1+2。

 

 

看完题目觉得有点复杂,涉及最佳路径选择问题,类似一个最短路径问题,快餐公司X为源点,其他写字楼$为终点,相邻方格(有相邻边的两个方格)是一条带权的边。单源最短路径,通过Dijkstra可以方式,用方格坐标(x,y)表示图的节点表示,虽然不太直观,但是没想到其他更好的方法。解决了路径问题,获得了每个目标方格的最短耗时后,还需要解决一个最优送货安排的问题,两个送货员该如何送货才能使得最终耗时最少。所以,整个题目涉及到两类最优,路径最优和送货次序最优。

 

通过第一个最优问题,得到了一组送货耗时情况的清单数组,然后找出送货员分别送货并总耗时最少的方法。对每一个送货员,除了最后一份披萨,其余的披萨送达后还要原路返回取货再送,所以,(每个送货员的总耗时)=(每份披萨单程耗时之和)*2-(最后一份披萨的单程耗时)。如果每个送货员送多份披萨,则耗时最长的那份适合最后送,这样有利于降低其个人总耗时。于是可以获得算法,在某个status(最多20家订餐客户,可选int类型,每个bit表示某送货员A需送的客户),然后,尝试转换status状态,将某个bit归零(表示转由B送),在对比转换前后总耗时的变化情况,如果总耗时降低则新状态有效。每个status对应记录所有bit置位客户的送货双程耗时之和,新旧状态装换对应的耗时计算只需要设计单个客户,比较方便。比较状态较优时,可以

  A1: T(status) - longestA1

  B1: Total-T(status) - longestB1

  A2: T(status) - time(bit)*2 - longestA2

  B2: Total-T(status) + time(bit)*2 - longestB2

如果max(A1,B1)>max(A2,B2),则认为状态转换是向优的,可以接受。

实现稍微有点长,不知哪些地方还可以改进。