原题链接:台球碰撞
解题思路:
欢迎加我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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复