题面
Description
小明是一位探险家,可惜一次探险摔断了腿,但这也阻止不了他探险,他发明了一个传送神器。假设小明在点(a,b),神器的传送值为(x,y),那么小明可以选择传送到(a+x,b+y),(a+x,b-y),(a-x,b+y),(a-x,b-y)中的一个,已知宝藏在点(c,d),小明想知道他能否找到宝藏。
Input
第一行一个整数T,表示有T组数据
每组数据第一行四个整数a,b,c,d,表示小明的位置和宝藏的位置
第二行两个整数x,y,表示神器的传送值。
Output
对于每组数据输出一行,一个YES或NO表示能否找到宝藏。
对于30%的数据,-100 ≤ a,b,c,d ≤ 100 ,1 ≤ x, y ≤ 100
对于100%的数据,-105 ≤ a,b,c,d ≤ 105 ,1 ≤ x, y ≤ 105,不超过100组数据
分析
其实第一个想到的应该是双向bfs吧。但是这题放在t1的位置,那一定是极其简单的,所以,就画图找规律
规律其实很简单,画出来可以发现能到达的点一定是在斜率为y/x,并且截距是相对于起始点所在的直线上加减2*y个单位的直线上
所以只需要分别判断这个点是否能在任意一条这样的直线上
注意一下避免除法,就好了。
代码
#include<bits/stdc++.h> using namespace std; int t,a,b,m,n,x,y; int main() { freopen("A.in","r",stdin); freopen("A.out","w",stdout); scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d%d",&a,&b,&x,&y,&m,&n); if(abs(a-x)%m==0&&abs(b-y)%n==0) { int am=m*b-n*a,bm=m*y-n*x; if(abs(am-bm)%(2*m*n)==0) { printf("YES "); continue; } } printf("NO "); } return 0; }