查找您可以在坐标平面中采用的路径数的算法

Posted

技术标签:

【中文标题】查找您可以在坐标平面中采用的路径数的算法【英文标题】: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。这里的一个基本要求是展示你编写的代码并解释什么是行不通的。我们不会为你做作业。 我已经附上了我到目前为止所做的代码。我一开始没有附上它,因为我很确定我以错误的方式接近它。 另见How do I ask and answer homework questions? 【参考方案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, '?');

【讨论】:

以上是关于查找您可以在坐标平面中采用的路径数的算法的主要内容,如果未能解决你的问题,请参考以下文章

查找 GPS 坐标路径上的所有城市

24. dfs数的路径查找

从 xyz 坐标中查找多边形的面积

最短路径算法 ——求出路径长度 (*^__^*) 嘻嘻……

在Shapely中查找路径起点的坐标距离

如何将经纬度转换成XY坐标呢?