【NOIP模拟】挖宝藏

题面

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\n");
                continue;
            }    
        }
        printf("NO\n");
    }    
    return 0;
}

 

posted @ 2018-10-02 09:33  WJEMail  阅读(355)  评论(0编辑  收藏  举报