解题思路:
首先,按照L,W,x,y,R,a,v,s的形式来讲
第一点,明确台球中心点概念,每次碰撞并不是中心点碰撞台球桌边界,而是以边界撞击边界值,所以台球中心点的位移区域是R<=x<=L-R,R<=y<=W-R,
由此我们计算中心点,可以把初始(x 、y)都-R,初始(L、W) -2R
第二点,由于不消耗动能,每次都是完全弹性碰撞,你可以做出四个角度的sinx、cosx,并在此基础上发现每次碰撞,只不过是将Vx(x方向速度),Vy(y方向速度)取反,
第三点,仔细思考,你会发现无论哪个角度而言,无论a为0或者359度,Vx始终是x坐标轴的v*cosa,Vy始终是y坐标轴的v*sina
第四点,既然知道了恒等,那么是否可以用 s(秒)*v(速度)求总距离,那么延伸来讲,是不是用 (x-R+Xdistance)%(L-2R)+ R 来表示台球X轴方向相对位置,(y-R +Ydistance) | (W-2R)来表示台球Y轴方向相对位置,
第五点, 考虑碰撞次数问题,
假设Vx为正数,那么s*Vx为正数,假设x方向碰撞了一次,那么X方向的distance%(L-2R)是不是要取反才是x,y的坐标,第二次碰撞是不是就不用取反,...
那假设Vx是负数,碰撞一次依旧要上一轮基础上取反,第二次不用
所以计算碰撞次数n,在用幂次方判断(-1)** n,就可以得到结果
注意事项:
参考代码:
import math
while True:
Lis = [int(i) for i in input().split()]
if (Lis[0]==0 and Lis[1]==0 and Lis[2]==0 and Lis[3]==0
and Lis[4]==0 and Lis[5]==0 and Lis[6]==0 and Lis[7]==0):
break
x, y = math.cos(math.radians(Lis[5])), math.sin(math.radians(Lis[5]))
n1 = (-1)**((Lis[2] + x * Lis[7] * Lis[6] - Lis[4]) // (Lis[0] - 2 * Lis[4]))
n2 = (-1)**((Lis[3] + y * Lis[7] * Lis[6] - Lis[4]) // (Lis[1] - 2 * Lis[4]))
res1 = n1*(Lis[2]+x*Lis[7]*Lis[6]-Lis[4])%(Lis[0]-2*Lis[4])+Lis[4]
res2 = n2*(Lis[3]+y*Lis[7]*Lis[6]-Lis[4])%(Lis[1]-2*Lis[4])+Lis[4]
print('{:.2f} {:.2f}'.format(res1, res2))
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复