利用反向推理来解决“到达终点”问题

Posted &小小白&

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用反向推理来解决“到达终点”问题相关的知识,希望对你有一定的参考价值。

七、到达终点

7.1、题设要求

​​  给定四个整数 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)进行计算与判断,得出boolean值。

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;
        
    

以上是关于利用反向推理来解决“到达终点”问题的主要内容,如果未能解决你的问题,请参考以下文章

K短路问题模板(spfa+A*)

Azure 排队服务总线超过百万条记录的功能没有到达终点

到达终点时循环QSpinbox

LeetCode 0754. 到达终点数字

当某些点被阻挡时到达终点的最小跳跃

离子幻灯片(ion-slides):到达终点时隐藏寻呼机