阿里在线编程测试题–派送货物,求最短路径(C语言实现)

阿里在线编程测试题–派送货物,求最短路径斜体样式
如下图,某物流派送员p,需要给 a、b、c、d. 4个快递点派送包裹,请问派送员需要选择什么样的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,且边长为1,如p到d的距离就是4。随机输入n个派送点坐标,求输出最短派送路线值(从起点开始完成n个点派送并回到起始点的距离)。
在这里插入图片描述
输入示例:
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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那由塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值