2010-1121

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

题目类型: 

几何、物理、模拟 

题目大意: 

足球射门练习。每一个CASE给出足球起点坐标,初速度大小,初速度方向,问球能不能进。

解题思路: 

由于不考虑空气阻力,只考虑弹地后的速度损失,若竖直方向速度分量为0,则球做匀速直线运动。
利用模拟法,根据当前弹地后的速度,计算出下一次弹地的位置。判断这个线段是否与球门线相交,若相交,求出交点,根据交点算出该点高度,判断是否在门框内;若不相交,继续求下一次落地。直到球出界或速度减为0。

代码: 


{{{
#include "cstdio"
#include "iostream"
#include "cstring"
#include "cstdlib"
#include "algorithm"
#include "cmath"

using namespace std;

const double EPS = 1e-8;
struct Point {
double x, y;
};
struct Line {
Point a, b;
};
inline bool zero(double x) {
return ((x > 0 ? x : -x) < EPS);
}
//?? cross product (P1 - P0)x(P2 - P0)
inline double xmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
inline double xmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);
}
//?? dot product (P1 - P0).(P2 - P0)
inline double dmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y);
}
inline double dmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0);
}
//????
inline double dis(const Point & p1, const Point & p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
inline double dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
//?????
bool dotsInline(const Point & p1, const Point & p2, const Point & p3) {
return zero(xmult(p1, p2, p3));
}
bool dotsInline(double x1, double y1, double x2, double y2, double x3, double y3) {
return zero(xmult(x1, y1, x2, y2, x3, y3));
}
//????????, ????
bool dotOnlineIn(const Point & p, const Line & l) {
return zero(xmult(p, l.a, l.b)) && (l.a.x - p.x) * (l.b.x - p.x) < EPS && (l.a.
y - p.y) * (l.b.y - p.y) < EPS;
}
bool dotOnlineIn(const Point & p, const Point & l1, const Point & l2) {
return zero(xmult(p, l1, l2)) && (l1.x - p.x) * (l2.x - p.x) < EPS && (l1.y - p
.y) * (l2.y - p.y) < EPS;
}
bool dotOnlineIn(double x, double y, double x1, double y1, double x2, double y2) {
return zero(xmult(x, y, x1, y1, x2, y2)) && (x1 - x) * (x2 - x) < EPS && (y1 -
y) * (y2 - y) < EPS;
}
//????????, ?????
bool dotOnlineEx(const Point & p, const Line & l) {
return dotOnlineIn(p, l) && (!zero(p.x - l.a.x) || !zero(p.y - l.a.y)) && (!zero(p.x - l.b.x) || !zero(p.y - l.b.y));
}
bool dotOnlineEx(const Point & p, const Point & l1, const Point & l2) {
return dotOnlineIn(p, l1, l2) && (!zero(p.x - l1.x) || !zero(p.y - l1.y)) && (!
zero(p.x - l2.x) || !zero(p.y - l2.y));
}
bool dotOnlineEx(double x, double y, double x1, double y1, double x2, double y2) {
return dotOnlineIn(x, y, x1, y1, x2, y2) && (!zero(x - x1) || !zero(y - y1)) &&
(!zero(x - x2) || !zero(y - y2));
}
//????????, ??????? 0
bool sameSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) > EPS;
}
bool sameSide(const Point & p1, const Point & p2, const Point & l1, const Point & l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) > EPS;
}
//????????, ??????? 0
bool oppositeSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) < -EPS;
}
bool oppositeSide(const Point & p1, const Point & p2, const Point & l1, const Point
& l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) < -EPS;
}
//??????
bool parallel(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.y - v.b.y) - (v.a.x - v.b.x) * (u.a.y - u.b.
y));
}
bool parallel(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.y - v2.y) - (v1.x - v2.x) * (u1.y - u2.y));
}
//??????
bool perpendicular(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.x - v.b.x) + (u.a.y - u.b.y) * (v.a.y - v.b.
y));
}
bool perpendicular(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.x - v2.x) + (u1.y - u2.y) * (v1.y - v2.y));
}
//??????, ?????????
bool intersectIn(const Line & u, const Line & v) {
if (!dotsInline(u.a, u.b, v.a) || !dotsInline(u.a, u.b, v.b)) {
return !sameSide(u.a, u.b, v) && !sameSide(v.a, v.b, u);
} else {
return dotOnlineIn(u.a, v) || dotOnlineIn(u.b, v) || dotOnlineIn(v.a, u) ||
dotOnlineIn(v.b, u);
}
}
bool intersectIn(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
if (!dotsInline(u1, u2, v1) || !dotsInline(u1, u2, v2)) {
return !sameSide(u1, u2, v1, v2) && !sameSide(v1, v2, u1, u2);
} else {
return dotOnlineIn(u1, v1, v2) || dotOnlineIn(u2, v1, v2) || dotOnlineIn(v1
, u1, u2) || dotOnlineIn(v2, u1, u2);
}
}
//??????, ??????????
bool intersectEx(const Line & u, const Line & v) {
return oppositeSide(u.a, u.b, v) && oppositeSide(v.a, v.b, u);
}
bool intersectEx(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
return oppositeSide(u1, u2, v1, v2) && oppositeSide(v1, v2, u1, u2);
}
//???????, ????????????!
//????????????(???????????!)
Point intersection(const Line & u, const Line & v) {
Point ret = u.a;
double t = ((u.a.x - v.a.x) * (v.a.y - v.b.y) - (u.a.y - v.a.y) * (v.a.x - v.b.
x)) / ((u.a.x - u.b.x) * (v.a.y - v.b.y) - (u.a.y - u.b.y) * (v.a.x - v.b.x));
ret.x += (u.b.x - u.a.x) * t;
ret.y += (u.b.y - u.a.y) * t;
return ret;
}
Point intersection(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
Point ret = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) / ((
u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ret.x += (u2.x - u1.x) * t;
ret.y += (u2.y - u1.y) * t;
return ret;
}
//?????????
Point ptoline(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
return intersection(p, t, l.a, l.b);
}
Point ptoline(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
return intersection(p, t, l1, l2);
}
//??????
double disptoline(const Point & p, const Line & l) {
return fabs(xmult(p, l.a, l.b)) / dis(l.a, l.b);
}
double disptoline(const Point & p, const Point & l1, const Point & l2) {
return fabs(xmult(p, l1, l2)) / dis(l1, l2);
}
double disptoline(double x, double y, double x1, double y1, double x2, double y2) {
return fabs(xmult(x, y, x1, y1, x2, y2)) / dis(x1, y1, x2, y2);
}
//?????????
Point ptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? l.a : l.b;
} else {
return intersection(p, t, l.a, l.b);
}
}
Point ptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? l1 : l2;
} else {
return intersection(p, t, l1, l2);
}
}
//??????
double disptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? dis(p, l.a) : dis(p, l.b);
} else {
return fabs(xmult(p, l.a, l.b))/dis(l.a, l.b);
}
}
double disptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? dis(p, l1) : dis(p, l2);
} else {
return fabs(xmult(p, l1, l2))/dis(l1, l2);
}
}
//?? V ? P ???????? angle ??? scale ?
Point rotate(Point v, Point p, double angle, double scale) {
Point ret = p;
v.x -= p.x;
v.y -= p.y;
p.x = scale * cos(angle);
p.y = scale * sin(angle);
ret.x += v.x * p.x - v.y * p.y;
ret.y += v.x * p.y + v.y * p.x;
return ret;
}


int main()
{
    int casenum=0;
    double x0,y0,x00,y00,x1,y1,t,v,x,y,z;
    double g=9.80665;


    Point gg1,gg2;
    gg1.x = 68/2-7.32/2;
    gg1.y = 0;
    gg2.x = 68/2+7.32/2;
    gg2.y = 0;
    Line ggl;
    ggl.a=gg1;
    ggl.b=gg2;

    while (scanf("%lf%lf", &x00, &y00)!=EOF)
    {
        casenum++;
        printf("Case #%d:\n", casenum);

        int nn;
        scanf("%d", &nn);
        for (int ii=1;ii<=nn;ii++)
        {
            printf("Shot %d: ", ii);
            int flag =0;
            x0=x00;
            y0=y00;
            scanf("%lf%lf%lf%lf", &v, &x, &y, &z);

            while (v>1e-8 && flag==0)
            {

                double temp = sqrt(x*x+y*y+z*z);
                t = 2*v*z/temp/g;
                x1 = x0+x/temp * v *t;

       //         cout << x << "||"  << temp << "||"  << v<< "||"  << t << endl;

                y1 = y0+y/temp * v *t;

                if (z==0)
                {
                    x1 = x0+100/temp*x;
                    y1 = y0+100/temp*y;
                }



                Point p1,p2;
                p1.x = x0;
                p1.y = y0;
     //                 cout << x0 << " " << y0 << " --> ";

      //                     cout << x1 << " " << y1  <<endl;

                p2.x = x1;
                p2.y = y1;


                Line l;
                l.a =p1;
                l.b =p2;
                if (intersectIn(l,ggl))
                {
         //           cout << "!!" <<  x1 << " " << y1  <<endl;

                    double tt;
                    if (y1!=y0)
                    {
                        tt = t * (0-y0) /(y1-y0);
                    }
                    double h=v*z/temp*tt-0.5*g*tt*tt;
                    if (h<=2.44)
                        flag =1;
                    else 
                        flag =-1;

                    if (y1==y0) flag = 1;

                }
                else
                {
                    if (x1<0 || x1>68 || y1<0 || y1>105)
                    {
 //                     cout << "!!" <<  x1 << " " << y1  <<endl;
                      flag = -1;

                    }
//                     cout << "!!" <<  x1 << " " << y1  <<endl;
                   x0 = x1;
                    y0 = y1;
                    v /= 2;
   //                                 cout << "!!" <<  flag << " " << v  <<endl;

                }                


            }
            if (flag==1)
            puts("yes");
            else
            puts("no");



        }
    }


}



}}}

题目类型:

几何、物理、模拟

题目大意:

足球射门练习。每一个CASE给出足球起点坐标,初速度大小,初速度方向,问球能不能进。

解题思路:

由于不考虑空气阻力,只考虑弹地后的速度损失,若竖直方向速度分量为0,则球做匀速直线运动。

利用模拟法,根据当前弹地后的速度,计算出下一次弹地的位置。判断这个线段是否与球门线相交,若相交,求出交点,根据交点算出该点高度,判断是否在门框内;若不相交,继续求下一次落地。直到球出界或速度减为0。

代码:

#include "cstdio"
#include "iostream"
#include "cstring"
#include "cstdlib"
#include "algorithm"
#include "cmath"
using namespace std;
const double EPS = 1e-8;
struct Point {
double x, y;
};
struct Line {
Point a, b;
};
inline bool zero(double x) {
return ((x > 0 ? x : -x) < EPS);
}
//?? cross product (P1 - P0)x(P2 - P0)
inline double xmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
inline double xmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);
}
//?? dot product (P1 - P0).(P2 - P0)
inline double dmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y);
}
inline double dmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0);
}
//????
inline double dis(const Point & p1, const Point & p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
inline double dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
//?????
bool dotsInline(const Point & p1, const Point & p2, const Point & p3) {
return zero(xmult(p1, p2, p3));
}
bool dotsInline(double x1, double y1, double x2, double y2, double x3, double y3) {
return zero(xmult(x1, y1, x2, y2, x3, y3));
}
//????????, ????
bool dotOnlineIn(const Point & p, const Line & l) {
return zero(xmult(p, l.a, l.b)) && (l.a.x - p.x) * (l.b.x - p.x) < EPS && (l.a.
y - p.y) * (l.b.y - p.y) < EPS;
}
bool dotOnlineIn(const Point & p, const Point & l1, const Point & l2) {
return zero(xmult(p, l1, l2)) && (l1.x - p.x) * (l2.x - p.x) < EPS && (l1.y - p
.y) * (l2.y - p.y) < EPS;
}
bool dotOnlineIn(double x, double y, double x1, double y1, double x2, double y2) {
return zero(xmult(x, y, x1, y1, x2, y2)) && (x1 - x) * (x2 - x) < EPS && (y1 -
y) * (y2 - y) < EPS;
}
//????????, ?????
bool dotOnlineEx(const Point & p, const Line & l) {
return dotOnlineIn(p, l) && (!zero(p.x - l.a.x) || !zero(p.y - l.a.y)) && (!zero(p.x - l.b.x) || !zero(p.y - l.b.y));
}
bool dotOnlineEx(const Point & p, const Point & l1, const Point & l2) {
return dotOnlineIn(p, l1, l2) && (!zero(p.x - l1.x) || !zero(p.y - l1.y)) && (!
zero(p.x - l2.x) || !zero(p.y - l2.y));
}
bool dotOnlineEx(double x, double y, double x1, double y1, double x2, double y2) {
return dotOnlineIn(x, y, x1, y1, x2, y2) && (!zero(x - x1) || !zero(y - y1)) &&
(!zero(x - x2) || !zero(y - y2));
}
//????????, ??????? 0
bool sameSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) > EPS;
}
bool sameSide(const Point & p1, const Point & p2, const Point & l1, const Point & l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) > EPS;
}
//????????, ??????? 0
bool oppositeSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) < -EPS;
}
bool oppositeSide(const Point & p1, const Point & p2, const Point & l1, const Point
& l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) < -EPS;
}
//??????
bool parallel(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.y - v.b.y) - (v.a.x - v.b.x) * (u.a.y - u.b.
y));
}
bool parallel(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.y - v2.y) - (v1.x - v2.x) * (u1.y - u2.y));
}
//??????
bool perpendicular(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.x - v.b.x) + (u.a.y - u.b.y) * (v.a.y - v.b.
y));
}
bool perpendicular(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.x - v2.x) + (u1.y - u2.y) * (v1.y - v2.y));
}
//??????, ?????????
bool intersectIn(const Line & u, const Line & v) {
if (!dotsInline(u.a, u.b, v.a) || !dotsInline(u.a, u.b, v.b)) {
return !sameSide(u.a, u.b, v) && !sameSide(v.a, v.b, u);
} else {
return dotOnlineIn(u.a, v) || dotOnlineIn(u.b, v) || dotOnlineIn(v.a, u) ||
dotOnlineIn(v.b, u);
}
}
bool intersectIn(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
if (!dotsInline(u1, u2, v1) || !dotsInline(u1, u2, v2)) {
return !sameSide(u1, u2, v1, v2) && !sameSide(v1, v2, u1, u2);
} else {
return dotOnlineIn(u1, v1, v2) || dotOnlineIn(u2, v1, v2) || dotOnlineIn(v1
, u1, u2) || dotOnlineIn(v2, u1, u2);
}
}
//??????, ??????????
bool intersectEx(const Line & u, const Line & v) {
return oppositeSide(u.a, u.b, v) && oppositeSide(v.a, v.b, u);
}
bool intersectEx(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
return oppositeSide(u1, u2, v1, v2) && oppositeSide(v1, v2, u1, u2);
}
//???????, ????????????!
//????????????(???????????!)
Point intersection(const Line & u, const Line & v) {
Point ret = u.a;
double t = ((u.a.x - v.a.x) * (v.a.y - v.b.y) - (u.a.y - v.a.y) * (v.a.x - v.b.
x)) / ((u.a.x - u.b.x) * (v.a.y - v.b.y) - (u.a.y - u.b.y) * (v.a.x - v.b.x));
ret.x += (u.b.x - u.a.x) * t;
ret.y += (u.b.y - u.a.y) * t;
return ret;
}
Point intersection(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
Point ret = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) / ((
u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ret.x += (u2.x - u1.x) * t;
ret.y += (u2.y - u1.y) * t;
return ret;
}
//?????????
Point ptoline(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
return intersection(p, t, l.a, l.b);
}
Point ptoline(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
return intersection(p, t, l1, l2);
}
//??????
double disptoline(const Point & p, const Line & l) {
return fabs(xmult(p, l.a, l.b)) / dis(l.a, l.b);
}
double disptoline(const Point & p, const Point & l1, const Point & l2) {
return fabs(xmult(p, l1, l2)) / dis(l1, l2);
}
double disptoline(double x, double y, double x1, double y1, double x2, double y2) {
return fabs(xmult(x, y, x1, y1, x2, y2)) / dis(x1, y1, x2, y2);
}
//?????????
Point ptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? l.a : l.b;
} else {
return intersection(p, t, l.a, l.b);
}
}
Point ptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? l1 : l2;
} else {
return intersection(p, t, l1, l2);
}
}
//??????
double disptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? dis(p, l.a) : dis(p, l.b);
} else {
return fabs(xmult(p, l.a, l.b))/dis(l.a, l.b);
}
}
double disptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? dis(p, l1) : dis(p, l2);
} else {
return fabs(xmult(p, l1, l2))/dis(l1, l2);
}
}
//?? V ? P ???????? angle ??? scale ?
Point rotate(Point v, Point p, double angle, double scale) {
Point ret = p;
v.x -= p.x;
v.y -= p.y;
p.x = scale * cos(angle);
p.y = scale * sin(angle);
ret.x += v.x * p.x - v.y * p.y;
ret.y += v.x * p.y + v.y * p.x;
return ret;
}
int main()
{
    int casenum=0;
    double x0,y0,x00,y00,x1,y1,t,v,x,y,z;
    double g=9.80665;
    Point gg1,gg2;
    gg1.x = 68/2-7.32/2;
    gg1.y = 0;
    gg2.x = 68/2+7.32/2;
    gg2.y = 0;
    Line ggl;
    ggl.a=gg1;
    ggl.b=gg2;
    while (scanf("%lf%lf", &x00, &y00)!=EOF)
    {
        casenum++;
        printf("Case #%d:\n", casenum);
        int nn;
        scanf("%d", &nn);
        for (int ii=1;ii<=nn;ii++)
        {
            printf("Shot %d: ", ii);
            int flag =0;
            x0=x00;
            y0=y00;
            scanf("%lf%lf%lf%lf", &v, &x, &y, &z);
            while (v>1e-8 && flag==0)
            {
                double temp = sqrt(x*x+y*y+z*z);
                t = 2*v*z/temp/g;
                x1 = x0+x/temp * v *t;
       //         cout << x << "||"  << temp << "||"  << v<< "||"  << t << endl;
                y1 = y0+y/temp * v *t;
                if (z==0)
                {
                    x1 = x0+100/temp*x;
                    y1 = y0+100/temp*y;
                }
                Point p1,p2;
                p1.x = x0;
                p1.y = y0;
     //                 cout << x0 << " " << y0 << " --> ";
      //                     cout << x1 << " " << y1  <<endl;
                p2.x = x1;
                p2.y = y1;
                Line l;
                l.a =p1;
                l.b =p2;
                if (intersectIn(l,ggl))
                {
         //           cout << "!!" <<  x1 << " " << y1  <<endl;
                    double tt;
                    if (y1!=y0)
                    {
                        tt = t * (0-y0) /(y1-y0);
                    }
                    double h=v*z/temp*tt-0.5*g*tt*tt;
                    if (h<=2.44)
                        flag =1;
                    else 
                        flag =-1;
                    if (y1==y0) flag = 1;
                }
                else
                {
                    if (x1<0 || x1>68 || y1<0 || y1>105)
                    {
 //                     cout << "!!" <<  x1 << " " << y1  <<endl;
                      flag = -1;
                    }
//                     cout << "!!" <<  x1 << " " << y1  <<endl;
                   x0 = x1;
                    y0 = y1;
                    v /= 2;
   //                                 cout << "!!" <<  flag << " " << v  <<endl;
                }                
            }
            if (flag==1)
            puts("yes");
            else
            puts("no");
        }
    }
}