您的位置:首页 > Web前端

[Offer收割]编程练习赛29 题目1 : 逃离迷宫4

2017-10-01 14:26 134 查看
时间限制: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

思路:如果能由(x,y)走到(a,b),那么就可以由(a,b)倒着回到(x,y)。dfs即可。其中要注意(10000000,1)这样的数据。
#include<bits/stdc++.h>
using namespace std;
int x,y;
int dfs(int a,int b)
{
if(a==x&&b==y)return 1;
if(a==0||b==0)return 0;
if(a==b)return 0;
if(a>b)
{
if(a%b==0)return dfs(a-(a/b-1)*b,b);
return dfs(a-(a/b)*b,b);
}
if(b%a==0)return dfs(a,b-(b/a-1)*a);
return dfs(a,b-(b/a)*a);
}
int main()
{
int T;cin>>T;
while(T--)
{
int a,b;
scanf("%d%d%d%d",&x,&y,&a,&b);
puts(dfs(a,b)?"YES":"NO");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: