2016-09-11 3 views
0

私はグリッドのユニークなパスの問題を解決しようとしています。この問題は、左上(0,0)から右下(たとえばA、B)までの2Dグリッド内で可能な一意のパスの数を見つけることを含む。 1つは右または下にしか移動できません。私の最初の試みは次のとおりです。グリッドのユニークなパス - 再帰

#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; 
} 

私はセグメンテーションフォルトを取得することになります。私は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

あなたのコードの問題はわかりません。しかし、あなたは再帰を使わずに問題を解決することができます。

方法1:この問題は簡単な数学スキルで解決できます。 の要件は、 ポイントでのみ下または右に移動できることです。したがって、SからDまでの正確な(m + n)ステップを必要とし、(m + n)ステップのうちのnステップが下がります。したがって、答えはC(m + n、n)です。

方法2:コンピュータサイエンスの方法で問題を解決しましょう。これは一般的な動的な プログラミングの問題です。ロボットが(i、j)に立っていると仮定しよう。 ロボットはどのように(i、j)に到着しましたか?ロボットは(i -1、j)から下に移動するか、(i、j-1)から右に移動することができます。したがって、(i、j)へのパスは(i-1、j)へのパスと(i、j-1)へのパスの合計に等しくなります。 別の配列を使用して、すべてのノードへのパスを格納し、式 を使用することができます:paths(i、j)= 1 // i == 0またはj == 0 paths(i、j)= paths(i - 1、 )+ paths(i、j - 1)// i!= 0とj!= 0しかし、より多くの の考えを与えれば、実際には2次元配列を必要としないことがわかります すべてを記録するロボットが行iにあるときの値は、 (i - 1)のパスのみである必要があります。したがって、式は次のようになります。 のiパス(j)=パス(j-1)+パス(j)// j!= 0の場合はpaths(j)= 1 // j == 0

詳細については、こちらをご覧ください:https://algorithm.pingzhang.io/DynamicProgramming/unique_path.html