原题链接:台球碰撞
解题思路:
化为质点忽略半径,利用对称解决反弹
注意事项:
a=a*asin(1)/90//把角度转化为弧度( 没有用这个公式因为精度问题错了两遍o(╥﹏╥)o )
参考代码:
#include<stdio.h>
#include<math.h>
main()
{
double L,W,R,a,v,s,x,y;
while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x,&y,&R,&a,&v,&s) && L!=0)//只需判断一个 L!=0 即可。
{
L-=2*R; W-=2*R;//长宽减去 2R
x-=R; y-=R;// X,Y 减去 R,这样就可以把球看成质点运动。
x+=v*cos(a*asin(1)/90)*s; y+=v*sin(a*asin(1)/90)*s;//速度分解为X,Y方向 * 时间
while(x<0 || x>L)// X 超出边界
{
if(x>L) x=2*L-x;//X关于L对称
if(x<0) x=-x;// X 关于 0 对称
}
while(y<0 || y>W)// Y 同上
{
if(y>W) y=2*W-y;
if(y<0) y=-y;
}
printf("%.2lf %.2lf\n",x+R,y+R);// 原坐标加回 R , 系统会自动四舍五入
}
}0.0分
9 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
我这也有一个版本,大家看看如何 #include<stdio.h> #include<math.h> #define PI 3.141592 int main() { double L,W,x,y,a,v,s,R,m,x1,y1; while(scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&L,&W,&x,&y,&R,&a,&v,&s)) { if(L==0) break; a = a * asin( 1 ) * 2 / 180; x1=x+v*s*cos(a); y1=y+v*s*sin(a); while(1) { if(x1>(L-R)) x1=2*(L-R)-x1; else if(x1<R) x1=2*R-x1; if(y1>(W-R)) y1=2*(W-R)-y1; else if(y1<R) y1=2*R-y1; if(R<=x1&&x1<=L-R&&R<=y1&&y1<=W-R) break; } printf("%.2lf %.2lf\n",x1,y1); } return 0; }