Problem C: Ball
Description
給出空間上兩個運(yùn)動的小球,球心坐標(biāo)在分別是A(xa , ya , 0),B(xb , yb , 0),半徑分別為Ra , Rb,速度分別為Va( vax, vay , 0), Vb( vbx , vby, 0)。判斷兩個小球是否會碰撞,若會碰撞, 輸出首次碰撞時的時刻和兩個小球的坐標(biāo);若不會碰撞,輸出“Impossible”(球心和速度的z坐標(biāo)恒為0,可將本題視為只是平面上的運(yùn)動。初始時刻為0,若初始時刻小球貼在一起,視為首次碰撞)。
Input
第一行:一個整數(shù)T,(T ≤ 30),表示下面有T組數(shù)據(jù)。
接下來,每兩行組成一組數(shù)據(jù),首行包含5個實(shí)數(shù),用空格隔開,依次是xa , ya , vax, vay , Ra,下面一行也包含5個實(shí)數(shù),依次是xa , ya , vbx , vby, Rb。每組數(shù)據(jù)之間有一個空行。
Output
對于每組數(shù)據(jù),如果兩個小球會碰撞,輸出首次碰撞時的時刻t,和兩個小球的坐標(biāo)xap , yap , xbp , ybp ,用空格隔開,保留三位小數(shù)。如果不能,輸出“Impossible”。
Sample Input
3
100 200 0 0 55
100 100 0 0 45
131 123 45 2 43
454 230 0 -5 35
100 100 1 1 31
200 200 2 2 23
解一元二次方程。
#include <iostream>
#include <cmath>

int main()
{
int ca,flag;
double xa,ya,xb,yb,vax,vay,vbx,vby,ra,rb;
double x1,x2,y1,y2,a,b,c,t,t1,t2,r;
scanf("%d",&ca);

while(ca--)
{
scanf("%lf %lf %lf %lf %lf",&xa,&ya,&vax,&vay,&ra);
scanf("%lf %lf %lf %lf %lf",&xb,&yb,&vbx,&vby,&rb);
r=(ra+rb),x1=xa-xb,x2=vax-vbx,y1=ya-yb,y2=vay-vby;
a=x2*x2+y2*y2,b=2*x1*x2+2*y1*y2,c=x1*x1+y1*y1-r*r;
flag=0;
if(c<=0)
printf("%.3lf %.3lf %.3lf %.3lf %.3lf\n",0.000,xa,ya,xb,yb);
else if(a==0) flag=1;
else if(b*b-4*a*c<0) flag=1;

else
{
t1=(-b+sqrt(b*b-4*a*c))/(2*a);
t2=(-b-sqrt(b*b-4*a*c))/(2*a);
t=(t1<t2 && t1>=0) ? t1:t2;
if(t<0) flag=1;
else printf("%.3lf %.3lf %.3lf %.3lf %.3lf\n",t,xa+vax*t,ya+vay*t,xb+vbx*t,yb+vby*t);
}
if(flag) puts("Impossible");
}
return 0;
}
Sample Output
0.000 100.000 200.000 100.000 100.000
6.179 409.053 135.358 454.000 199.105
Impossible