路小鹿


私信TA

用户名:Deer

访问量:2824

签 名:

等  级
排  名 1495
经  验 1588
参赛次数 2
文章发表 4
年  龄 0
在职情况 学生
学  校 哈尔滨工程大学
专  业

  自我简介:

TA的其他文章

解题思路:

欢迎加我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 人评分

  评论区

好,棒,算法很简单
2020-02-10 21:08:55 | |
  • «
  • 1
  • »