题目
思路 暴力
根据题意,在sx和sy不大于tx和ty时,遍历所有情况,结果会超时。
代码
class Solution {
public:
bool reachingPoints(int sx, int sy, int tx, int ty) {
return dfs(sx, sy, tx, ty);
}
bool dfs(int sx, int sy, int tx, int ty){
cout<<sx<<' '<<sy<<endl;
if(sx > tx || sy > ty) return false;
if(sx == tx && sy == ty) return true;
if(dfs(sx + sy, sy, tx, ty) || dfs(sx, sx + sy, tx, ty)) return true;
return false;
}
};
思路 数学
由于从起点到终点的路径是唯一确定的,因此可以反向来推,在tx和ty中,用大数减去小数(合并类似的运算),直到不满足`sx < tx && sy < ty`。如果`tx < sx || ty < sy`说明不符合。如果sx与tx相等,则判断ty能否通过减去tx到达sy。如果ty与sy相等,则判断tx能否通过减去ty到达sx。
代码
class Solution {
public:
bool reachingPoints(int sx, int sy, int tx, int ty) {
while(sx < tx && sy < ty){
if(tx < ty) ty %= tx;
else tx %= ty;
}
if(tx < sx || ty < sy) return false;
return sx == tx ? (ty - sy) % tx == 0 : (tx - sx) % ty == 0;
}
};