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++;
}
}