南邮 OJ 1180 H - 管道小球

H - 管道小球

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 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);
}






你可能感兴趣的:(ACM,-,h,南邮OJ,管道小球)