hdu 5572

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <map>
#include <queue>
#include <stdlib.h>
#include <cmath>
#include <vector>
#include <stack>

#define clr(x) memset(x,0,sizeof(x))
#define clr2(x) memset(x,INF,sizeof(x))
#define clr3(x) memset(x,-INF,sizeof(x))
#define INF 0x3f3f3f3f
#define MAXN 100010
#define MAXM 100010
#define pb(x) push_back(x)
#define ll long long
#define ull unsigned long long

using namespace std;
double ox,oy,r,ax,ay,vx,vy,bx,by;

bool spj()
{
    double t1,t2;
    if (vx!=0)  t1=(bx-ax)/vx;
    if (vy!=0)  t2=(by-ay)/vy;
    if (t1==t2) return true;

    if (vy==0 && ay==by) return true;
    if (vx==0 && ax==bx) return true;

    return false;
}
bool judge()
{
    cin>>ox>>oy>>r>>ax>>ay>>vx>>vy>>bx>>by;
    double k1=ax-ox;
    double k2=ay-oy;

    double a=vx*vx+vy*vy;
    double b=2*k1*vx+2*k2*vy;
    double c=k1*k1+k2*k2-r*r;

    if (ax==bx && ay==by) return true;
    if (b*b-4*a*c<0) return spj();

    double t1= (-b+sqrt(b*b-4*a*c))/ (2*a) ;
    double t2= (-b-sqrt(b*b-4*a*c))/ (2*a) ;

    double t=min(t1,t2);
    if (t<0) t=max(t1,t2);

    if (t<0) return false;

    double kx=ax+vx*t;
    double ky=ay+vy*t;


    double alpha_x=kx-ox;
    double alpha_y=ky-oy;

    double AK_x=kx-ax;
    double AK_y=ky-ay;
    double BK_x=kx-bx;
    double BK_y=ky-by;

    double cosAK= (AK_x*alpha_x+AK_y*alpha_y)/ (sqrt( alpha_x*alpha_x + alpha_y* alpha_y) * sqrt(AK_x*AK_x+AK_y*AK_y) );
    double cosBK= (BK_x*alpha_x+BK_y*alpha_y)/ (sqrt( alpha_x*alpha_x + alpha_y* alpha_y) * sqrt(BK_x*BK_x+BK_y*BK_y) );

    if (fabs(cosAK-cosBK)<=1e-9) return true;
    else return false;

}
void solve(int Case)
{
    if (judge())
        printf("Case #%d: Yes\n",Case);
    else
        printf("Case #%d: No\n",Case);
}
int main()
{
    int T,Case=0;
    scanf("%d",&T);
    while (T--)
        solve(++Case);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章