我正在练习使用DFS来解决机器人路径问题。机器人只能通过以下两种方式移动:
给定一个点(10,12),机器人能否到达某一点(32,22)?
我编写了以下代码,但它还没有完成,它只适用于像(10,22)这样的情况,例如(x,x + y)。如果测试用例是(x +(x + y),x + y),例如(32,22),我的代码不起作用。我想我仍然对正确使用DFS感到困惑。
public boolean canReach(int x1, int y1, int x2, int y2) {
return dfs(x1, y1, x2, y2);
}
private boolean dfs(int x1, int y1, int x2, int y2) {
if (x1 == x2 && y1 == y2) {
return true;
} else if (x1 > x2 && y1 > y2) {
return false;
} else if (x1 < x2 || y1 >= y2) {
return dfs(x1+y1, y1, x2, y2);
} else {
return dfs(x1, x1+y1, x2, y2);
}
}
当我绘制DFS运行图时,它开始看起来像一棵树,每个节点都有两个子节点。例如:
(10, 12)
/ \
(10,22) (22, 12)
我还想过创建一个布尔数组visited
来表示是否已访问过一个节点,但我不知道这个数组的大小应该是多少。
非常感谢任何帮助!我真的想亲自动手使用DFS来解决这些路径问题。
替代解决方案我想出了递归(不是DFS),如下所示。在每次移动中,x2 = x1
或y2 = y1
。因此x1 + y1
必须大于x1
或y1
这种情况必须始终为真:y2 > x2
或x2 > y2
public boolean canReach2(int x1, int y1, int x2, int y2) {
return findPath(x1, y1, x2, y2);
}
private boolean findPath(int x1, int y1, int x2, int y2) {
if (x1 == x2 && y1 == y2) {
return true;
} else if (x2 < x1 && y2 < y1) {
return false;
} else {
if (y2 > x2) {
return findPath(x1, y1, x2, y2-x2);
} else {
return findPath(x1, y1, x2-y2, y2);
}
}
}
答案 0 :(得分:2)
试试这个。
public boolean findPath(int x1, int y1, int x2, int y2) {
if (x1 == x2 && y1 == y2)
return true;
else if (x1 > x2 || y1 > y2)
return false;
else
return x1 > 0 && findPath(x1, x1 + y1, x2, y2)
|| y1 > 0 && findPath(x1 + y1, y1, x2, y2);
}