解题思路:

首先,按照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))

点赞(2)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论