狙击敌人

1013: 狙击敌人

时间限制: 1 Sec 内存限制: 128 MB
提交: 10 解决: 4
[提交][状态]
题目描述
小明有一次运气贼好,跳在一个小野区,突然掉了一个空投,直接砸在他的脸上,可把他乐坏了,走近一打开补给包,AWM+3级头+8倍镜+20发.300马格南,令人窒息!
小明拿着AWM,立即往山上跑,想用这把传说中的枪,爆敌人的头。不一会,小明看到一个挂机仔,躲在一块石头后面。我们将小明的枪口和技机仔的头看成二维平面上的两个点(x1,y1),(x2,y2),小明瞄准后开了一枪,子弹援照(dx,dy)的方向运动(即每毫秒子弹的x坐标+dx,y坐标+dy),如果子弹的运动轨迹能经过(x2,y2),那么子弹就能打中敌人的头。我们来预测一下小明能否用这把AWM一枪爆掉敌人的头,如果能,输出“YES”,否则输出“NO”。
输入
多组测试数据,首先第一行一个整数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。
输出
如果小明能用这把AWM一枪爆掉敌人的头,输出“YES”,否则输出“NO”。
样例输入
2
1 1 2 2 2 2
1 1 3 1 0 1
样例输出
YES
NO
来源
2018IMCPC

判断斜率和方向即可

#include<iostream>  
#include<cstring>  
#include<string>  
#include<math.h>  
using namespace std;  

int sgn(int x){  
    return x<0?x==0?0:1:-1;  
}  

int main(){  
    int t;  
    while(cin>>t){  
        while(t--){  
            int flag=1;  
            int x1,y1,x2,y2,dx,dy;  
            cin >> x1 >> y1 >> x2 >> y2 >> dx >> dy;  
            if((x2-x1)*(dy)-(y2-y1)*(dx)!=0)  
                flag=0;  
            if(sgn(dx)!=sgn(x2-x1) || sgn(dy)!=sgn(y2-y1))  
                flag=0;  
            if(flag)  
                cout << "YES" << '\n';  
            else  
                cout << "NO" << '\n';  
        }  
    }  
    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/ZhangWei527/article/details/80722637