解题思路:


化为质点忽略半径,利用对称解决反弹

注意事项:


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 , 系统会自动四舍五入 
	}
 }


点赞(19)
 

0.0分

9 人评分

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

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

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

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

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

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

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

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

评论列表 共有 6 条评论

一往而深 5年前 回复TA
我这也有一个版本,大家看看如何
#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;
 }
神经韫Hacker 5年前 回复TA
大佬,时间超限50%了,不过感觉你的方法比其他的要好理解,非常感谢!!!!!
z能 5年前 回复TA
思想很棒
z能 5年前 回复TA
@z能 懂了
z能 5年前 回复TA
为什么scanf前要加个负号
不时后会 5年前 回复TA
膜拜大佬