原题链接:台球碰撞
解题思路:
欢迎加我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; } }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复