1766: 弹珠游戏
题目描述
AC喜欢玩弹珠游戏。他将桌面看成一个平面,同时他在桌面上摆放了一些障碍物。障碍物分为2种:
(1) 圆形障碍物
(2) 线段障碍物
其中圆形障碍物是实心的,线段障碍物的宽度忽略,同时障碍物可以交叠。一开始AC选择一个位置,并以一个初速度v 将弹珠投出去。由于桌面是粗糙的,存在阻力,于是弹珠的速度大小每过单位时间(1秒)就减小 s ,我们假设弹珠碰到障碍物后无能量损失。AC想知道弹珠滚动了多久,最终停在了哪里,如果你解决了这个问题,或许AC会高兴地请你吃饭!
输入
数据的第一行是一个整数T,表示数据的组数。
之后T组数据,每组数据的第一行是一个整数n,表示障碍物的个数
之后n行,每一行的开始给出一个字符 S
(1) S = ‘A’ 表示障碍物为圆形,同时后面给出3个整数 x y r 表示它的圆心坐标以及半径;
(2) S = ‘B’ 表示障碍物为线段,同时后面给出4个整数 x0 y0 x1 y1 , 表示线段的两个不同端点。
之后4个浮点数 px py vx vy 分别表示弹珠的初始位置以及初始速度向量。
最后一个浮点数 s 表示阻力造成的每过单位时间(1秒)的速度大小的减小量。
对于数据:
(1) T≤10
(2) 不存在重复的障碍物;
(3) 0 ≤ n ≤ 10
(4) 对于线段障碍物, 给出的2个端点必然不同。-100 ≤x0,y0,x1,y1 ≤100;
(5) 对于圆形障碍物,-100 ≤x,y ≤ 100, 0 <r ≤ 100;
(6) 对于弹珠,保证初始位置不在任何障碍物内部或边界上, 弹珠半径足够小可以看成一个点,-1000.0 ≤ px,py,vx ,vy ≤ 1000.0;
(7) 对于单位速度减小量s, 保证s > 0.0
(8) 碰触到边界也算碰撞(若运动轨迹完全经过某个线段,则不算碰撞);

(9) 碰撞时弹珠如果和大于1个的障碍接触那么直接反射(速度向量旋转180度,下面是几个例子),否则类似镜面反射(反射不花费时间):



(10) 注意不要输出 “-0.00”。
输出
输出两个浮点数 x y, 表示弹珠停止的位置,保留2位小数(四舍五入)。
之后输出一个浮点数 t, 表示弹珠滚动的时间(秒), 保留2位小数(四舍五入)。
样例输入 复制
3
2
A 0 0 1
B -1 0 1 0
2.0 0.0 -1.0 0.0
0.5
1
A 2 0 1
0 -1 1 1
0.1
1
A 2 0 1
0 -1 0 0
0.5
样例输出 复制
1.00 0.00
2.00
-5.07 6.07
14.14
0.00 -1.00
0.00