解题思路:

欢迎加我QQ啊:1551755561(路小鹿)

假设画一张无限大的网格,球在上面走简单的直线(不拐弯)。

最后按网格上的线折叠,直到终点落回到原始小矩形内,求这时的坐标即可。


注意事项:

算法没错,但总有小误差,修修改改后才通过。注意两点即可:

1,用double,别用float;

2,需要圆周率时(角度转换为弧度),之直接写“3.1415926”的精确度还是不够!上网搜一个更精确的果然通过了。

又看到这里第一个答案,学到了计算圆周率的好方法


参考代码:

#include<iostream>
#include<cmath>
#include<iomanip>

using namespace std;
double DuiZhe(double num, double Zhou)//对折函数,num关于Zhou(轴)对称值
{
	return 2.0 * Zhou - num*1.0;
}

double L, W, X, Y, R, a, v, s;
int main()
{
	double a2, x_big, y_big;//a2是a角度转换为的弧度角
	
	while (cin >> L >> W >> X >> Y >> R >> a >> v >> s)
	{
		if (L == 0 && W == 0 && X == 0 && Y == 0 && R == 0 && a == 0 && v == 0 && s == 0)
			return 0;
			
		//a2 = a*0.0174532925199389;//可以
		//a2 = a*3.1415926/180;//不可以
		a2 = a*asin(1)*2/180;//可以
		
		//如果不拐弯,小球最远到达的坐标
		x_big = X + v*s*cos(a2);
		y_big = Y + v* s*sin(a2);
		
		//将小球走过的直线对折,直到终点落到题中所给的小矩形
		while (1)
		{
			if (x_big > L - R)
				x_big = DuiZhe(x_big, L - R);
			else if (x_big < R)
				x_big = DuiZhe(x_big, R);
			else break;
		}
		while (1)
		{
			if (y_big > W - R)
				y_big = DuiZhe(y_big, W - R);
			else if (y_big < R)
				y_big = DuiZhe(y_big, R);
			else break;
		}
		
		//格式化输出
		cout << setiosflags(ios::fixed) << setprecision(2);
		cout <<x_big << " " << y_big << endl;
	}
}


点赞(11)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 1 条评论

余小C 4年前 回复TA
好,棒,算法很简单