思路分析:这道题确实非常妙!大部分的人一般都会惯性思维死劲想着怎么从(sx, sy)推到(tx, ty),
蛋式由于可以变换的情况非常多,特别是当起点与终点的差距比较大的时候。如果我们逆向思考呢,
从(tx, ty)推到(sx, sy),则时只能有一种操作,就是将tx、ty中较大值减去较小值(因为顺推的时候是(x, y)
可以转换到 (x, x+y) 或者 (x+y, y),则逆推的时候只能将较大者减去较小者),这样思维方式确实很妙!
加上三处 剪枝效果更佳
class Solution {
public:
bool reachingPoints(int sx, int sy, int tx, int ty) {
if(tx < sx || ty < sy) return false;
while(tx && ty)
{
if(tx == sx && ty == sy) return true;
if(tx > ty)
{
if(tx - sx < ty) return false;
tx -= max((tx - sx) / ty, 1) * ty;
}
else
{
if(ty - sy < tx) return false;
ty -= max((ty - sy) / tx, 1) * tx;
}
}
return false;
}
};