1340: 移动坐标

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”。

输入

第一行: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 ; 
} 
 
原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7869008.html