「終わりに到達する」問題を解決するために後向き推論を使用する

7.エンドポイントに到達します

7.1。タイトルの要件

4つの整数sx、sy、tx、およびtyが与えられた場合、一連の遷移を介して開始点(sx、sy)から終了点(tx、ty)に到達できる場合はtrueを返し、そうでない場合はfalseを返します。ポイント(x、y)から、(x、x + y)または(x + y、y)に変換できます。

示例 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

提示:
1 <= sx, sy, tx, ty <= 109

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/reaching-points

7.2.問題解決のアイデア

この質問では、逆推論操作を使用します。最初に(tx、ty)で逆操作を実行し、逆操作を実行できなくなるまで(最終的には(sx、sy)の次の状態にプッシュされます)、次のことができます。次のステップの操作に進み、上記の結論と(sx、sy)から導き出された状態を計算して判断し、ブール値を取得します。

画像の説明を追加してください

7.3。アルゴリズム

class Solution {
    
    
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
    
    
        //将(tx,ty)进行反向操作,直到无法进行反向操作,就可以进行下一步
        //最终将会推至(sx,sy)的下一个状态
        while(tx > sx && ty > sy && tx != ty){
    
    
            if(tx > ty)
                //上一个状态为(tx - ty,ty)
                tx %= ty;
            else
                //上一个状态为(tx,ty - tx)
                ty %= tx;
        }
        //将上述结论推出的状态与(sx,sy)进行计算与判断,得出boolean值
        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;
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_52916408/article/details/124108822