zoukankan      html  css  js  c++  java
  • 1328 台球碰撞 (湖南省第六届大学生计算机程序设计竞赛)

    Description

    在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角)。

    image

    如果球的速率为v,s个时间单位之后球心在什么地方?

    Input

    输入文件最多包含25组测试数据,每个数据仅一行,包含8个正整数L,W,x,y,R,a,v,s100<=L,W<=105, 1<=R<=5, R<=x<=L-R, R<=y<=W-R, 0<=a<360,1<=v,s<=105),含义见题目描述。L=W=x=y=R=a=v=s=0表示输入结束,你的程序不应当处理这一行。

    Output

    对于每组数据,输出仅一行,包含两个实数x,y,表明球心坐标为(x,y)。x和y应四舍五入保留两位小数。

    Sample Input

    100 100 80 10 5 90 2 23
    110 100 70 10 5 180 1 9999
    0 0 0 0 0 0 0 0
    

    Sample Output

    80.00 56.00
    71.00 10.00
    

    对于这个题真的感觉到了程序的魅力。

    一个感觉很复杂的问题,最后分解下来特别简单。

    将初始方向分解为x轴和y轴方向,然后整个模型就可以分成两部分;

    • x轴方向来回运动
    • y轴方向来回运动

    然后最后算一下就可以了。

    #include <bits/stdc++.h>
    using namespace std;
     
    int main()
    {
        double L,W,x,y,R,a,v,s;
        while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &L, &W, &x, &y, &R, &a, &v, &s), L||W||x||y||R||a||v||s )
        {
            x -= R, y -= R, L -= 2*R, W -= 2*R;
            a = 2 * acos(-1) * a / 360;
            double l = v * s;
            x = x + l * cos(a), y = y + l * sin(a);
            double m =  fmod(fmod(x, 2*L) + 2*L, 2*L), n = fmod(fmod(y, 2*W)+2*W, 2*W);
            if(m <= L)
                x = m;
            else
                x = L - (m - L);
     
            if(n <= W)
                y = n;
            else
                y = W - (n - W);
            printf("%.2f %.2f
    ", x+R, y+R);
        }
        return 0;
    }
    
  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/aiterator/p/6795589.html
Copyright © 2011-2022 走看看