问题 C: 狙击敌人

 

内存限制:128 MB时间限制:1 S标准输入输出

 

 

题目描述

小明有一次运气贼好,跳在一个小野区,突然掉了一个空投,直接砸在他的脸上,可把他乐坏了,走近一打开补给包,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

问题 C: 狙击敌人_C语言

 

思路:判断斜率和方向即可

 

代码:

#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;
}