南郵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)で小さなボールを動かします.小さなボールがパイプの壁にぶつかると、小さなボールが完全に反発します.小さなボールは出口断面に到達できますか?断面座標は何ですか?
入力
a,b,X,vx,vy,vz(0しゅつりょく
ボールがパイプ出口断面に到達すると、実数: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
",X,0,0); }else{ printf("impossible
"); } return 0; } t = X/vx; if(t<0){ printf("impossible
"); 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
",X,disy,disz); }