1340: 移动坐标
时间限制: 1 秒 内存限制: 128 MB | 提交: 85 解决: 30
题目描述
给你两个点A、B,和固定移动距离(x,y),问是否可以通过移动A点若干次最终到B点。
有四种移动方法:
(a,b)->(a+x,b+y);
(a,b)->(a+x,b-y);
(a,b)->(a-x,b+y);
(a,b)->(a-x,b-y);
如果可以输出“YES”,否则输出“NO”。
有四种移动方法:
(a,b)->(a+x,b+y);
(a,b)->(a+x,b-y);
(a,b)->(a-x,b+y);
(a,b)->(a-x,b-y);
如果可以输出“YES”,否则输出“NO”。
输入
第一行:T,测试实例个数:
第二行:四个整数。x1,y1,x2,y2。分别是A点的坐标和B点的坐标。 - 10^5 ≤ x1, y1, x2, y2 ≤ 10^5
第三行:两个整数。x,y是固定移动距离 (1 ≤ x, y ≤ 105)
输出
“YES”或者“NO”。
样例输入
2
0 0 0 6
2 3
1 1 3 6
1 5
样例输出
YES
NO
思路:分别计算 x 方向和 y 方向 最少 需要多少次 移动可以到达 目标位置的 对应坐标。
以最后到达的 方向为标准 另一方提前到达的方向只要可以通过左右移动 清除(最大减去最小 为 2 的倍数)已到达方向上多余的移动 就可以到达目标位置
最后还需要注意,又可能 x 方向或者 y 方向上的 距离差 不是 x 与 y 的倍数 (对应方向永远不可能到达)
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std ; int main(){ int T ; int x1 , y1 , x2 , y2 ; int x , y ; scanf("%d" , &T) ; while(T--){ scanf("%d%d%d%d" , &x1 , &y1 , &x2 , &y2) ; scanf("%d%d" , &x , &y) ; int dx = abs(x1 - x2) ; int dy = abs(y1 - y2) ; if((dx%x!=0)||(dy%y!=0)){ printf("NO ") ; continue ; } if(dx/x > dy/y){ int num = dx/x ; num = num - dy/y ; if(num%2 == 0 ){ printf("YES ") ; continue ; } else { printf("NO ") ; } } else if(dx/x < dy/y){ int num = dy/y ; num = num - dx/x ; if(num%2==0){ printf("YES ") ; continue ; } else { printf("NO ") ; continue ; } } else if(dx/x == dy/y){ printf("YES ") ; continue ; } } return 0 ; }