Problem C. 狙击敌人

Problem C. 狙击敌人

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 259    Accepted Submission(s): 78


Problem Description
小明有一次运气贼好,跳在一个小野区,突然掉了一个空投,直接砸在他的脸上,可把他乐坏了。走近一打开补给包,AWM+3级头+8倍镜+20发.300马格南,令人窒息!
小明拿着AWM,立即往山上跑,想用这把传说中的枪,爆敌人的头。不一会,小明看到一个挂机仔,躲在一块石头后面。我们将小明的枪口和挂机仔的头看成二维平面上的两个点(x1,y1),(x2,y2),小明瞄准后开了一枪,子弹按照(dx,dy)的方向运动(即每毫秒子弹的x坐标+dx,y坐标+dy),如果子弹的运动轨迹能经过(x2,y2),那么子弹就能打中敌人的头,我们来预测一下小明能否用这把AWM一枪爆掉敌人的头,如果能,输出”YES”,否则输出”NO”。
 

Input
多组测试数据,首先第一行一个整数T(1≤T≤20),代表测试数据组数。
每组测试数据有 6 个整数 x1,y1,x2,y2,dx,dy,小明的枪口坐标为 (x1,y1), 敌人的坐标为(x2,y2),子弹的运动方向为 (dx,dy),保证枪口坐标和敌人的坐标不同,1 ≤ x1,y1,x2,y2 ≤ 1000,−1000≤dx,dy≤1000。
 

Output
如果小明能用这把AWM一枪爆掉敌人的头,输出”YES”,否则输出”NO”。
 

Sample Input
 
  
2 1 1 2 2 2 2 1 1 3 1 0 1
 

Sample Output
 
  
YES NO
 

Source
 
  
陈都测试2

判断(x1,y1)(x2,y2)判断两点的斜率和(xd,yd)是否相同,相同就代表在同一直线上。

主要斜率不存在的情况以及枪只会向着一个地方打,还要判断是否同向

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double x1,y1,x2,y2,xd,yd;
        scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&xd,&yd);
        if(xd==0){
            if(x1!=x2)printf("NO\n");
            else if(yd<0){
                if(y2<y1)printf("YES\n");
                else{printf("NO\n");}
            }
            else if(yd>0){
                if(y2>y1)printf("YES\n");
                else{printf("NO\n");}
            }
        }
        else{
            double k=yd/xd;
            if(x2-x1==0){printf("NO\n");continue;}
            double k1=(y2-y1)/(x2-x1);
            if(k1!=k){printf("NO\n");continue;}
            else{
                if((y2-y1)/yd>=0&&(x2-x1)/xd>=0){
                    printf("YES\n");
                }
                else{
                    printf("NO\n");
                }
            }
        }
    }

    return 0;
}


猜你喜欢

转载自blog.csdn.net/qibage/article/details/81053138