解题思路:

注意事项:

参考代码:

#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分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论