【问题标题】:Algorithm to find the number of paths you can take in a coordinate plane查找您可以在坐标平面中采用的路径数的算法
【发布时间】:2022-01-22 12:46:27
【问题描述】:

给你一个 NxN (2

N = 3, T = 3
...
.H.
...

Output: 2
N = 4, T = 3
...H
.H..
....
H...

Output: 6
N = 3, T = 2
.HH
HHH
HH.

Output: 0

D 表示向下移动,R 表示向右移动。对于第一种,两种方式是 DDRR 和 RRDD。对于第二种,六种方式分别是DDRDRR、DDRRDR、DDRRRD、RRDDDR、RRDDRD和RRDRDD。对于最后一个,没有办法让它到右下角。

我想到的一件事是可以使用 DFS 解决这个问题,但我不知道如何针对这个问题实施它。任何帮助都会非常有帮助。

我已经尝试过这种递归方法,但我很确定我完全走错了路。

public static void step(char[][] graph, int[] pos, int turns, int max)
{
    if(turns > max) return;
    else if(pos[0] == graph.length-1 && pos[1]==graph.length-1)
    {
        count++;
        return;
    }
    else if(pos[0] == graph.length && graph[pos[0]+1][pos[1]] == 'H') return;
    else if(pos[1] == graph.length && graph[pos[0]][pos[1]+1] == 'H') return;
    else if(graph[pos[0]+1][pos[1]] == 'H' && graph[pos[0]][pos[1]+1] == 'H') return;
    else {
        step(graph, new int[]{pos[0]+1, pos[1]}, turns+1, max);
        step(graph, new int[]{pos[0], pos[1]+1}, turns+1, max);
    }
}

【问题讨论】:

  • 这似乎是某种功课。你能提供你到目前为止制作的代码吗?
  • 请阅读How to Ask。这里的一个基本要求是展示你编写的代码并解释什么是行不通的。我们不会为你做作业。
  • 我已经附上了我到目前为止所做的代码。我一开始没有附上它,因为我很确定我以错误的方式接近它。

标签: java algorithm graph


【解决方案1】:

我在你的函数中发现了一些错误:

检查你是否越界的条件应该不需要检查是否有 H :越界意味着什么都没有,所以pos[0] == graph.length 应该足以停止。

检查是否有 H 挡路的条件也是错误的:要被阻止,您需要在您的右侧和下方都有一个 H。这意味着您仍然会探索一些通过 H 的路径。如果您目前在 H 上,您可以做的是停止:if(graph[pos[0]][pos[1]] == 'H')

递归调用总是增加轮数。转弯是允许你走的步数,还是你可以改变方向的次数?如果是后者,则需要在调用中传递当前方向,并且仅在更改方向时才递增。最初的调用有点棘手,因为第一步你并没有真正的方向。

全局观察是,您似乎混合了逻辑“AND”运算符 (&&)。也许我错了,但快速回顾一下可以帮助你,因为“OR”似乎更符合逻辑。

【讨论】:

    【解决方案2】:

    是的。假设转数是你改变方向的次数,你需要跟踪方向,只在方向改变时增加turns

    public static void step(char[][] graph, int[] pos, int turns, int max,
            char dir)
    {
        if(turns > max) return;
        else if(pos[0] == graph.length-1 && pos[1]==graph.length-1)
        {
            count++;
            return;
        }
        if(pos[0] < graph.length && pos[1] < graph.length
                && graph[pos[0]][pos[1]] != 'H') {
            step(graph, new int[]{pos[0]+1, pos[1]}, dir != 'R' ? turns : turns+1, max, 'D');
            step(graph, new int[]{pos[0], pos[1]+1}, dir != 'D' ? turns : turns+1, max, 'R');
        }
    }    
    

    初始调用将传递既不是'D' 也不是'R' 的任何字符:

        step(graph, new int[]{0, 0}, 0, t, '?');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2015-04-21
      • 2011-05-31
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多