解题思路:
首先,按照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分
2 人评分
点我有惊喜!你懂得!浏览:2252 |
C语言训练-阿姆斯特朗数 (C语言代码)浏览:898 |
C二级辅导-等差数列 (C语言代码)浏览:630 |
C语言程序设计教程(第三版)课后习题7.4 (Java代码)浏览:874 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:611 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:643 |
求组合数 (C语言代码)浏览:1212 |
C语言程序设计教程(第三版)课后习题6.8 (C++代码)浏览:615 |
C语言训练-数字母 (C语言代码)浏览:648 |
字符逆序 (C语言代码)浏览:645 |