阿里在线编程测试题–派送货物,求最短路径斜体样式
如下图,某物流派送员p,需要给 a、b、c、d. 4个快递点派送包裹,请问派送员需要选择什么样的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,且边长为1,如p到d的距离就是4。随机输入n个派送点坐标,求输出最短派送路线值(从起点开始完成n个点派送并回到起始点的距离)。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4902d56b5a8a960d2f815cce6b8b7a90.png)
输入示例:
2,2
2,8
4,4
7,2
输出:
30
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<windows.h>
#define Max 4
#define Min(a,b) a<b?a:b
typedef struct LNode
{ int x;
int y;
int number;
} LinkNode;
LinkNode *a[Max],*O;
//求两点间坐标差的绝对值之和
int Abs(LinkNode *p,LinkNode *q)
{ int k;k=abs(p->x -q->x )+abs(p->y - q->y );
return(k);
}
//求已确定入口出口的四点间最短坐标距离之和
int DistanceB4(int p,int q)
{ LinkNode *m,*n;
int i=0,j=0,M,N,D1,D2;
do{ m=a[i];
i++;
M=Abs(a[p],m);
}while(M!=0);
do{ n=a[j];
j++;
N=Abs(a[q],n);
}while(N!=0);
if(i+j!=5)
{ D1=Abs(a[p],a[4-i])+Abs(a[4-i],a[4-j])+Abs(a[4-j],a[q]);
D2=Abs(a[p],a[4-j])+Abs(a[4-j],a[4-i])+Abs(a[4-i],a[q]);
}
else if(i*j==4)
{ D1=Abs(a[p],a[1])+Abs(a[1],a[2])+Abs(a[2],a[q]);
D2=Abs(a[p],a[2])+Abs(a[2],a[1])+Abs(a[1],a[q]);
}
else if(i*j==6)
{ D1=Abs(a[p],a[0])+Abs(a[0],a[3])+Abs(a[3],a[q]);
D2=Abs(a[p],a[3])+Abs(a[3],a[0])+Abs(a[0],a[q]);
}
return(Min(D1,D2));
}
//求最短路径
int ResultMinDistance()
{ int i=0,j;
int MinDistance=100000,DLine;
for(i;i<4;i++)
{ j=i+1;
for(j;j<4;j++)
{
DLine=DistanceB4(i,j)+Abs(O,a[i])+Abs(a[j],O);
return(Min(DLine,MinDistance));
}
}
}
int main()
{ int i=0,result;
char ch;
O=(LinkNode *)malloc(sizeof(LinkNode));
O->x =0;O->y =0;printf("请输入四个个坐标(形如x,y):\n");
for(i;i<4;i++)
{ a[i]=(LinkNode *)malloc(sizeof(LinkNode));
scanf("%d,%d",&a[i]->x,&a[i]->y );
getchar();
}
result=ResultMinDistance();
printf("\n\n最短路径是:%d",result);
Sleep(2000);
}
作者:MingZhai