题意:
这题是一道简单的物理题,实际上只要一个抛物线的公式就可以了,一共有3种鸟,各有不同的特性:
红鸟的轨迹是一条抛物线;
黄鸟的前期轨迹是一条抛物线,在t时,黄鸟的Vx,Vy翻倍;
蓝鸟的前期轨迹是一条抛物线,在t时,可以分裂成3只小蓝鸟,每只的轨迹都是抛物线。
分析:
说来说去,其实都是求抛物线的,因此只要有一个函数用来计算,那么做起来会方便的多。
#include"stdio.h"
#include"string.h"
#include"math.h"
double fun(double vx,double vy,double h)//计算水平距离
{
return vx*(vy+sqrt(vy*vy+2*9.8*h))/9.8;
}
double fun1(double vy,double h,double t)//计算竖直高度。
{
return h+vy*t-4.9*t*t;
}
int main()
{
double m,n,vx,vy,t,v1,h,v2,v3,l;
char a[100];
while(scanf("%lf%s",&h,a)!=EOF)
{
if(strcmp(a,"Red")==0)
{
scanf("%lf%lf",&vx,&vy);
printf("%.3lf\n",fun(vx,vy,h));
}
else if(strcmp(a,"Blue")==0)
{
scanf("%lf%lf%lf%lf%lf%lf",&vx,&vy,&t,&v1,&v2,&v3);
m=fun(vx,vy,h);
n=fun1(vy,h,t);
if(m<t*vx)//如果t时刻已经落地。
{
printf("%.3lf\n",m);
continue;
}
// 否则的话重新计算此时的高度,竖直速度和水平距离。。
h=fun1(vy,h,t);
vy=vy-9.8*t;
l=vx*t;
printf("%.3lf %.3lf %.3lf\n",l+fun(v1,vy,h),l+fun(v2,vy,h),l+fun(v3,vy,h));
}
else
{
scanf("%lf%lf%lf",&vx,&vy,&t);
if(fun(vx,vy,h)<t*vx)//如果t时刻已经落地。
{
printf("%.3lf\n",fun(vx,vy,h));
continue;
}
//否则的话重新计算此时的高度,竖直速度和水平距离。。
h=fun1(vy,h,t);
l=vx*t;
vy=vy-9.8*t;
printf("%.3lf\n",l+fun(2*vx,2*vy,h));
}
}
return 0;
}