我正在尝试解决网格唯一路径问题。问题涉及从左上角(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)
上述代码有什么问题?
答案 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