打球?(左右对称)

丁小辉准备参加YT大学首届斯诺克比赛,但是他发现自己击中目标有问题。教练说:你必须在任何时刻知道球的位置,而球的位置是由击球的速度和时间决定的。那么,给定初始位置和初始速度,经过 t 时间后,球会落到台面的哪个点呢?

为简单起见,假定台面是一个矩形,矩形的左上角坐标是 (0,0), 右下角坐标是 (n,m)。现在有一个小球在矩形内部的 (x0,y0) 点,他的初始速度用 x 方向速度和 y 方向速度给出,分别用xv,yv 来代表。现在需要知道小球在 t 时间后的坐标。已知小球碰到矩形边界会发生完全弹性碰撞。注意:我们假设小球滚动的速度是恒定不变的。

Input

多组测试样例。

第一行输入两个数 n 和 m。(10<=n,m<=500)

第二行输入小球坐标 x0,y0。(1<=x0<=n,1<=y0<=m)

第三行给出小球横纵向速度 xv,yv。(0<=xv<=n,0<=yv<=m)

第四行输入一个时间 t。(1<=t<=1000)

所有输入均为正整数。

Output

两个数,分别代表 x 坐标和 y 坐标

Sample Input

10 101 14 63

Sample Output

7 1

先让球到达右边 看时间那个短然后看左右几次 然后加减


#include <iostream>

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main()
{
    double m,n,i,j,x0,y0,xv,yv,t,xs,ys,x,y,t1,t2,t3,p,q;
    int a,b;
    while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&n,&m,&x0,&y0,&xv,&yv,&t))
    {
        xs=n-x0;
        ys=m-y0;
        if(t*xv<=xs&&t*yv<=ys)
        {
            x=x0+t*xv;
            y=y0+t*yv;
        }
        else
        {
            t1=xs/xv;
            t2=ys/yv;
            t3=min(t1,t2);
            t-=t3;
            p=t;
            q=t;
            if(t3==t2)
            {
                p+=t3;
                p-=xs/xv;


            }
            if(t3==t1)
            {
                q+=t3;
                q-=t2;
            }
            a=xv*p/n;
            b=yv*q/m;
            if(a%2==0)
            {


                p-=a*n/xv;
                x=n-(p*xv);
            }
            if(a%2!=0)
            {
                p-=a*n/xv;
                x=p*xv;
            }
            if(b%2==0)
            {
                q-=b*m/yv;
                y=m-(q*yv);
            }
            if(b%2!=0)
            {
                q-=b*m/yv;
                y=q*yv;
            }
        }
        printf("%.0lf %.0lf\n",x,y);
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/najiuzheyangbaacm/article/details/80069286