使用DFS检查是否可以使用机械手路径

时间:2016-10-02 19:19:38

标签: java algorithm depth-first-search

我正在练习使用DFS来解决机器人路径问题。机器人只能通过以下两种方式移动:

  1. (x,y) - > (x,x + y)
  2. (x,y) - > (x + y,y)
  3. 给定一个点(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 = x1y2 = y1。因此x1 + y1必须大于x1y1 这种情况必须始终为真:y2 > x2x2 > 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);
                }
            }
        }
    

1 个答案:

答案 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);
}