给你一个无穷大的网格图。一开始你在 (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。