中南大学复试上机:最短路径

1025: 最短距离

 

题目描述

小王和小明是好朋友,两人最开始各有一个初始位置 p 和一个恒定速度 v,从0时刻起开始,他们从初始位置以恒定速度开始行走,请告诉我行走过程中两人的最短距离是多少。

输入

第一行输入T代表测试样例数目。 
对于每个样例,

第一行包含四个整数 x1,y1,x2,y2,表示人的起点(x1,y1),(x2,y2)。

第二行是四个整数u1,v1,u2,v2,表示人的初始速度(u1,v1),(u2,v2)。

T <= 1000 , x1,y1,x2,y2,u1,v1,u2,v2的绝对值不大于1000。 

输出

对于每个样例,输出一行。”Case i: d”。i 代表案例编号,d代表答案,四舍五入到小数点后6位。

样例输入

5
1 1 2 2
1 1 2 2

1 1 2 2
1 1 -1 -1

1 1 2 2
0 1 0 -1

1 1 1 1
1 1 2 2

0 0 0 1
0 1 1 0

样例输出

Case 1: 1.414214
Case 2: 0.000000
Case 3: 1.000000
Case 4: 0.000000
Case 5: 0.707107

代码:

#include<stdio.h>
#include<math.h>
int main(){
	int n;
	int i=1;
	scanf("%d",&n);
	while(n--){
	double result=0;
	int x1,y1,x2,y2;
	int u1,v1,u2,v2;
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	scanf("%d%d%d%d",&u1,&v1,&u2,&v2);
	double a,b;
	if((x1==x2)&&(y1==y2)){
		result=0;
	}
	else if((u1==u2)&&(v1==v2))
	result = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
	else{
	
	a=(u2-u1)*(u2-u1)+(v2-v1)*(v2-v1);
	b=2*(u2-u1)*(x2-x1)+2*(v2-v1)*(y2-y1);
	double zhong;
	zhong = -b/(2*a);
	if(zhong<0)
	zhong = 0;

	
	result = sqrt(((x2-x1)+(u2-u1)*zhong)*((x2-x1)+(u2-u1)*zhong)+((v2-v1)*zhong+(y2-y1))*((v2-v1)*zhong+(y2-y1))); 
}
	//result = (result*1000000+0.5)/1000000;
	printf("Case %d: %.6lf\n",i,result); 
	i++;
}
	
} 

 

点赞