网格唯一路径 - 递归

时间:2016-09-11 02:06:16

标签: recursion path grid

我正在尝试解决网格唯一路径问题。问题涉及从左上角(0,0)到右下角(比如A,B)找到2D网格中可能的唯一路径的数量。一个人只能向右或向下移动。这是我最初的尝试:

#include <stdio.h>

int count=0;
void uniquePathsRecur(int r, int c, int A, int B){
    if(r==A-1 & c==B-1){
        count++;
        return;
    }
    if(r<A-1){
        return uniquePathsRecur(r++,c,A,B);
    }
    if(c<B-1){
        return uniquePathsRecur(r,c++,A,B);
    }

}

int uniquePaths(int A, int B) {

    if(B==1 | A==1){
        return 1;
    }

    uniquePathsRecur(0,0,A,B);
    return count;
}


int main(){

printf("%d", uniquePaths(5,3));

return 0;
}

我最终得到了分段错误:11我的代码。我尝试在gdb中调试,我得到以下内容:

lldb) target create "a.out"
Current executable set to 'a.out' (x86_64).
(lldb) r
Process 12171 launched: '<path to process>/a.out' (x86_64)
Process 12171 stopped
* thread #1: tid = 0x531b2e, 0x0000000100000e38 a.out`uniquePathsRecur + 8, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7fff5f3ffffc)
    frame #0: 0x0000000100000e38 a.out`uniquePathsRecur + 8
a.out`uniquePathsRecur:
->  0x100000e38 <+8>:  movl   %edi, -0x4(%rbp)
    0x100000e3b <+11>: movl   %esi, -0x8(%rbp)
    0x100000e3e <+14>: movl   %edx, -0xc(%rbp)
    0x100000e41 <+17>: movl   %ecx, -0x10(%rbp)
(lldb)

上述代码有什么问题?

1 个答案:

答案 0 :(得分:0)

我不知道您的代码问题。但是你可以在不使用递归的情况下解决问题。

  

方法1:我们可以用简单的数学技巧解决这个问题。该   要求是你只能向下或向右移动   点。所以它需要从S到D的精确(m + n)步和从(m   + n)步骤下降。因此,答案是C(m + n,n)。

     

方法2:让我们以计算机科学的方式解决问题。这是一种典型的动态   编程问题。让我们假设机器人站在(i,j)。   机器人是如何到达(i,j)的?机器人可以从(i    - 1,j)或从(i,j - 1)向右移动。因此,(i,j)的路径等于到(i-1,j)的路径和到(i,j-1)的路径之和。我们可以用   另一个数组用于存储所有节点的路径并使用该等式   下面:路径(i,j)= 1 // i == 0或j == 0路径(i,j)=路径(i - 1,   j)+路径(i,j - 1)// i!= 0和j!= 0然而,给出更多   想一想,你会发现你实际上并不需要2D阵列   记录自机器人在第i行以来的所有值,您只需要   (i-1)处的路径。所以等式是:paths(j)= 1 // j == 0 for   任何i路径(j)=路径(j - 1)+路径(j)// j!= 0对于任何i

有关详细信息,请参阅此处:https://algorithm.pingzhang.io/DynamicProgramming/unique_path.html