Live2d Test Env

hihoCoder1599 bfs

特殊的剪枝,整体上和辗转相除法有点像

#1599 : 逃离迷宫4

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi被坏女巫抓进一座由无限多个格子组成的矩阵迷宫。

小Hi一开始处于迷宫(x, y)的位置,迷宫的出口在(a, b)。小Hi发现迷宫被女巫施加了魔法,假设当前他处在(x, y)的位置,那么他只能移动到(x+y, y)或者(x, x+y)的位置上。

小Hi想知道自己能不能逃离迷宫。

输入

第一行包含一个整数T,代表测试数据的组数。  

以下N行每行包含4个整数x, y, a, b,表示起点在(x, y),出口在(a, b)。  

对于30%的数据,1 ≤ T ≤ 10, 1 ≤ x, y, a, b ≤ 100  

对于80%的数据,1 ≤ T ≤ 1000, 1 ≤ x, y, a, b ≤ 1000  

对于100%的数据,1 ≤ T ≤ 10000, 1 ≤ x, y, a, b ≤ 109

输出

对于每组数据输出一行YES或者NO,表示小Hi是否能逃离迷宫。

样例输入
2  
1 1 8 13  
2 2 100 101
样例输出
YES  
NO


#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int a,b,c,d;
bool _find(int u,int v){
     while(1){
         if(u==0||v==0) return false;//试一下分母为0的话会怎么样 
         if(u<a&&v<b) return false;
         if(u<b&&v<a) return false;
         if(u<v){
           u^=v;
           v^=u;
           u^=v;
         }
         if(v==a&&u>=b&&(u-b)%v==0) return true;
         if(v==b&&u>=a&&(u-a)%v==0) return true;
         int tmp=u%v;
         u=v;v=tmp;
     }
}
int main()
{
    int T,i;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d",&a,&b,&c,&d);
        if(_find(c,d)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
View Code

 

posted @ 2017-10-23 18:03  nimphy  阅读(191)  评论(0编辑  收藏  举报