题目描述
给定四个整数 sx
, sy
,tx
和 ty
,如果通过一系列的转换可以从起点 (sx, sy)
到达终点 (tx, ty)
,则返回 true
,否则返回 false
。
从点(x, y)
可以转换到 (x, x+y)
或者 (x+y, y)
。
示例 :
输入: sx = 1, sy = 1, tx = 3, ty = 5
输出: true
解释:
可以通过以下一系列转换从起点转换到终点:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)
解题思路
从终点位置向前递推,因为 x
,y
均为正整数,所以 x+y
一定是大于 x
和 y
的,那么上一状态只有两种
1.(x-y, y) when x > y
2.(x, y-x) when y > x
如果上述两个过程其中一个重复执行,那么我们可以简化为
1.(x mod y, y) when x>y
2.(x, y mod x) when y>x
还有一种情况是 x>y && x mod y = 0
我们要将这种情况直接返回 true
,x<y && y mod x = 0
时同上
代码
bool reachingPoints(int sx, int sy, int tx, int ty){
//辗转相除法
if(sx > tx || sy > ty) return false;
if(((sx == tx)&&(sy == ty))||(((ty-sy)%sx == 0)&&sx == tx)||((sy == ty)&&(((tx-sx)%sy==0))))
return true;
if(tx>ty){return reachingPoints(sx,sy,tx%ty,ty);}
if(ty>tx){return reachingPoints(sx,sy,tx,ty%tx);}
return false;
}