https://www.lintcode.com/problem/1036
一次移动是指把(x, y)移动到(x, x + y)或(x + y, y).
给定起点(sx, sy)、目标点(tx, ty),当且仅当存在一系列移动,使得从起点开始,能到达终点,则返回True,否则返回False.
sx, sy, tx, ty 是正整数且值域为 [1, 10^9].
样例
样例 1:
输入: sx = 1, sy = 1, tx = 3, ty = 5
输出: True
解释:
存在一个从起点到终点的序列是:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)
样例 2:
输入: sx = 1, sy = 1, tx = 2, ty = 2
输出: False
样例 3:
输入: sx = 1, sy = 1, tx = 1, ty = 1
输出: True
//反向计算
/*
如果从sx,sy开始正向计算,则可能的情况非常多,容易超过时间限制。注意到sx,sy,tx,ty都是正整数,因此
对于给定状态的tx,ty,只有当tx!=ty时才存在上一个状态,且上一个状态唯一。可能情况如下:
1、如果tx==ty,不存在上一个状态,状态tx,ty即为起点状态
2、如果tx>ty,则上一个状态是 tx-ty,ty
3、如果ty>tx,则上一个状态该是tx,ty-tx
因此可以从tx,ty开始反向计算,判断是否可以到达状态sx,sy,当tx>sx,ty>sy,tx!=ty三个条件同时成立,
执行反向操作。每一步都是更新tx,ty的值,知道反向操作条件不成立
由于每一步反向操作都是一定将tx和ty中较大的值减少,因此当tx>ty时可以将tx更新为tx%ty,
当ty>tx时,可以直接将ty更新为ty%tx;
当反向操作的条件不成立时,更具tx和ty的不同情况来分别判断是否从起点到达终点
1、如果tx==sx && ty==sy,则已经达到起点状态,因此可以从起点到终点
2、如果tx==sx&& ty!=sy,则tx不能继续减少,只能减少ty,因此只有当ty>sy && (ty-sy)%tx ==0 时可以从起点到终点
3、如果ty==sy&& tx!=sx,则ty不能继续减少,只能减少tx,因为只有当tx>sx&&(tx-sx)%ty==0时可以从起点到达终点
4、如果tx!=sx&& ty!=sy,则不能从起点到达终点
*/
public class Solution {
/**
* @param sx: x for starting point
* @param sy: y for starting point
* @param tx: x for target point
* @param ty: y for target point
* @return: if a sequence of moves exists to transform the point (sx, sy) to (tx, ty)
*/
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
//反向计算
/*
如果从sx,sy开始正向计算,则可能的情况非常多,容易超过时间限制。注意到sx,sy,tx,ty都是正整数,因此
对于给定状态的tx,ty,只有当tx!=ty时才存在上一个状态,且上一个状态唯一。可能情况如下:
1、如果tx==ty,不存在上一个状态,状态tx,ty即为起点状态
2、如果tx>ty,则上一个状态是 tx-ty,ty
3、如果ty>tx,则上一个状态该是tx,ty-tx
因此可以从tx,ty开始反向计算,判断是否可以到达状态sx,sy,当tx>sx,ty>sy,tx!=ty三个条件同时成立,
执行反向操作。每一步都是更新tx,ty的值,知道反向操作条件不成立
由于每一步反向操作都是一定将tx和ty中较大的值减少,因此当tx>ty时可以将tx更新为tx%ty,
当ty>tx时,可以直接将ty更新为ty%tx;
当反向操作的条件不成立时,更具tx和ty的不同情况来分别判断是否从起点到达终点
1、如果tx==sx && ty==sy,则已经达到起点状态,因此可以从起点到终点
2、如果tx==sx&& ty!=sy,则tx不能继续减少,只能减少ty,因此只有当ty>sy && (ty-sy)%tx ==0 时可以从起点到终点
3、如果ty==sy&& tx!=sx,则ty不能继续减少,只能减少tx,因为只有当tx>sx&&(tx-sx)%ty==0时可以从起点到达终点
4、如果tx!=sx&& ty!=sy,则不能从起点到达终点
*/
while (tx > sx && ty>sy){
if(tx>ty){
tx =tx%ty;
}else{
ty=ty%tx;
}
}
if(tx ==sx && ty==sy){
return true;
}else if(tx==sx){
return ty>sy &&(ty-sy)%tx==0;
}else if(ty ==sy){
return tx>sx && (tx-sx)%ty ==0;
}else{
return false;
}
}
}