解题思路:
注意事项:
参考代码:
#define _USE_MATH_DEFINES
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(2); // 全局设置保留两位小数
double L, W, x, y, R, a, v, s;
while (true) {
// 循环读取多组数据
cin >> L >> W >> x >> y >> R >> a >> v >> s;
// 全0输入,结束程序
if (L == 0 && W == 0 && x == 0 && y == 0 && R == 0 && a == 0 && v == 0 && s == 0) {
break;
}
// 速度为0,直接输出原坐标
if (v == 0) {
cout << x << " " << y << endl;
continue;
}
// 角度转弧度,计算总位移
double rad = a * M_PI / 180.0;
double dx = cos(rad) * v * s;
double dy = sin(rad) * v * s;
// 有效运动区间长度
double x_span = L - 2 * R;
double y_span = W - 2 * R;
double new_x = x + dx;
double new_y = y + dy;
// 计算x轴最终位置(镜像反弹算法)
if (x_span > 0) {
double x_mod = fmod(new_x - R, 2 * x_span);//计算两个浮点数相除后的余数
if (x_mod < 0) x_mod += 2 * x_span; // 处理负数取模
new_x = (x_mod <= x_span) ? (R + x_mod) : (L - R - (x_mod - x_span));
}
// 计算y轴最终位置(镜像反弹算法)
if (y_span > 0) {
double y_mod = fmod(new_y - R, 2 * y_span);
if (y_mod < 0) y_mod += 2 * y_span; // 处理负数取模
new_y = (y_mod <= y_span) ? (R + y_mod) : (W - R - (y_mod - y_span));
}
// 输出结果(四舍五入保留两位小数)
cout << new_x << " " << new_y << endl;
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复