判断一个点是否可以到达

给定一个无穷大的网格图,从点(1,1)开始,每次可以移动到相邻的四个点之一。代码实现了一个判断是否能到达(targetX,targetY)的方法,通过迭代更新tx和ty的值,检查它们是否在同一连续整数序列中。关键在于利用二进制操作简化状态转移。
摘要由CSDN通过智能技术生成

给你一个无穷大的网格图。一开始你在 (1, 1) ,你需要通过有限步移动到达点 (targetX, targetY) 。

每一步 ,你可以从点 (x, y) 移动到以下点之一:

(x, y - x)
(x - y, y)
(2 * x, y)
(x, 2 * y)
给你两个整数 targetX 和 targetY ,分别表示你最后需要到达点的 X 和 Y 坐标。如果你可以从 (1, 1) 出发到达这个点,请你返回true ,否则返回 false 。

代码如下:

class Solution {
public:
    bool isReachable(int tx, int ty) {
        while(tx!=ty ||(tx==ty && (tx&1)==0)){
            cout<<tx<<' '<<ty<<endl;
            //if(tx==1||ty==1)return 1;//简单优化
            if((tx&1)==0){tx>>=1;continue;}
            if((ty&1)==0){ty>>=1;continue;}
            if(tx>ty)tx+=ty;
            else ty+=tx;
        }
        cout<<tx<<' '<<tx<<endl;
        cout<<(tx==1?"Y":"N")<<endl<<endl;
        if(tx==1)return 1;
        return 0;
    }
};

这段代码定义了一个名为 Solution 的类,其中包含一个名为 isReachable 的公共方法。该方法接受两个整数参数 tx 和 ty,并返回一个布尔值,表示这两个整数是否在同一个连续的整数序列中。

在 isReachable 方法中,使用了一个 while 循环来检查两个整数是否在连续的整数序列中。当两个整数的值不同且没有同号的时候,继续检查它们是否连续。在这个循环中,输出两个整数的值,并根据它们的位置更新它们的值。如果两个整数的值相同且同号,则跳过这一次循环。

其中,以下代码,参考一下计算机组成原理二进制储存。

if((tx&1)==0){tx>>=1;continue;}
if((ty&1)==0){ty>>=1;continue;}

在循环结束后,如果 tx 的值等于 ty 的值,则说明它们不在连续的整数序列中。在这种情况下,tx 和 ty 的值都是 1,因此方法返回 1。如果 tx 的值不等于 ty 的值,则说明它们在连续的整数序列中。在这种情况下,方法继续检查 tx 和 ty 的值是否相等,并在 tx 的值等于 ty 的值时返回 1,否则返回 0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值