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; }
It is your time to fight!