#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<windows.h>
#define Min(a,b) a<b?a:b
typedef struct LNode //声明结构体类型
{ int x;
int y;
} LinkNode; //定义结构体体变量
LinkNode *a[4],*O; //定义数组指针
//定义一个函数,求两点间距离
int Abs(LinkNode *p,LinkNode *q)
{
int k;
k=sqrt(pow(p->x -q->x,2)+pow(p->y -q->y,2 ));
return(k); //k的返回值为两点间距离
}
//求最短路径
int DistanceB4(int p,int q)
{ LinkNode *m,*n;
int i=0,j=0,M,N,D1,D2;
do{
m=a[i]; //m相当于i点坐标
M=Abs(a[p],m); //调用Abs函数,求i和p点距离
i++;
}while(M!=0); //i,p点距离为0时跳出循环
do{
n=a[j]; //n相当于j点坐标
N=Abs(a[q],n); //调用Abs函数,求j和q点距离
j++;
}while(N!=0); //j,p点距离为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]); //调用Abs函数,求D1路径时的距离和
D2=Abs(a[p],a[4-j])+Abs(a[4-j],a[4-i])+Abs(a[4-i],a[q]); //调用Abs函数,求D2路径时的距离和
}
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));
}
}
}
void save( )
{
FILE *fp;
int i;
if((fp=fopen("D:\stu.dat","wb"))==NULL)
{
printf("CANNOT OPEN FILE\n");
return;
}
for(i=0;i<4;i++)
if(fwrite(&a[i],sizeof(struct LNode ),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int main() //主函数
{
int i=0,result;
char ch;
O=(LinkNode *)malloc(sizeof(LinkNode));
O->x =0;
O->y =0; //指针o指向原点
printf("请输入四个个坐标(形如x,y):\n"); //输入提示语
for(i;i<4;i++)
{ a[i]=(LinkNode *)malloc(sizeof(LinkNode)); //开辟一个动态内存地址
scanf("%d,%d",&a[i]->x,&a[i]->y ); //输入x,y
getchar();
}
result=ResultMinDistance(); //调用ResultMinDistance函数,得出最短路径
printf("\n\n最短路径是:%d",result);
}
这个程序只能输出最短距离的长度,但是加入哪些程序可以输出达到最短距离的路径点