H - 管道小球
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 64 测试通过 : 18
总提交 : 64 测试通过 : 18
比赛描述
有一个截面为长方形的管道,不放假设在笛卡尔坐标系中,该管道的中轴线恰好为x轴,管道的入口位于平面x=0,管道出口位于x=X。
管道界面的长为a,宽为b,且长边平行于y轴,宽边平行于z轴。
假设在管道的入口处(0,0,0)有一个半径可忽略并且不计重力的小球,现在给小球一个初速度v=(vx,vy,vz)使得小球运动。假设当小球与管道壁相碰,小球会完全的反弹。请问小球能否到达出口截面?截面坐标是什么?
输入
一行,包含6个整数:a,b,X,vx,vy,vz(0<b<a<10000,0<=x<=10000,-10000<=vx,vy,vz<=10000)
输出
若小球能到达管道出口截面,则输出一个实数:X,Y,Z,用单个空格隔开,表示到达是的坐标,否则,输出“impossible”,所有结果保留3位小数。
样例输入
10 10 10 10 0 0
样例输出
10.000 0.000 0.000
提示
undefined
题目来源
NJU 7th ACM contest
#include<iostream>
int main(){
// freopen("test.txt","r",stdin);
double a,b,X,vx,vy,vz,t,disy,disz;
scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&X,&vx,&vy,&vz);
if(vx==0){
if(X==0){
printf("%.3lf %.3lf %.3lf\n",X,0,0);
}else{
printf("impossible\n");
}
return 0;
}
t = X/vx;
if(t<0){
printf("impossible\n");
return 0;
}
disy = vy*t;
while(disy<-a/2){
disy += 2*a;
}
while(disy>3*a/2){
disy -= 2*a;
}
if(disy>a/2){
disy = a-disy;
}
disz = vz*t;
while(disz<-b/2){
disz += 2*b;
}
while(disz>3*b/2){
disz -= 2*b;
}
if(disz>b/2){
disz = b-disz;
}
printf("%.3lf %.3lf %.3lf\n",X,disy,disz);
}