2017-10-18 18 views
2

私はCには新しく、0と文字が通過点で1が障壁である迷路問題を実行しようとしています。C再帰セグメント分割エラー

私の2D迷路の配列は始点が(0,4)にあり、毎回4方向(N、S、E、W)をチェックする必要があり、パス配列も含まれていますIは経路探索のために、以下である総使用3機能に再帰溶液を使用してい

1111S11110  
0000010001 
110100010d 
t001111110 
0100000001 
0111111101 
1111111101 
00000D01T1 
0111110001 
0000E01110 

:私はまた、同じサイズである「R」としてルートを置く文字としての「0」)

int isSafe(char Mazearray[matrixSize][matrixSize],int x,int y){ 
    if(x >= 0 && x < matrixSize && y >= 0 && y < matrixSize && Mazearray[x][y] != '1'){ 
     return 1; 
    } 
    return 0; 


} 

void MazeSolution(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize]){ 
    if(recursiveMaze(Mazearray,x,y,pathArray) == 0){ 
     printf("There does not exist a possible solution!!!"); 
    } 
    else{ 
     int i,j; 
     for (i = 0; i < matrixSize; ++i){ 
      for (j = 0; j < matrixSize; ++j){ 
       printf("%c",pathArray[i][j]); 
      } 
     printf("\n"); 
     } 
    } 
} 

int recursiveMaze(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize]){ 
    if(x == exitX && y == exitY){ 
     pathArray[x][y] == 'E'; 
     return 1; 
    } 
    // check if the coordinate is safe to go(not 1) 
    if(isSafe(Mazearray,x,y) == 1){ 
     pathArray[x][y] == 'R'; 
     // Move North 
     if(recursiveMaze(Mazearray,x-1,y,pathArray) == 1){ 
      return 1; 
     } 
     // Move South 
     if(recursiveMaze(Mazearray,x+1,y,pathArray) == 1){ 
      return 1; 
     } 
     // Move East 
     if(recursiveMaze(Mazearray,x,y+1,pathArray) == 1){ 
      return 1; 
     } 
     // Move West 
     if(recursiveMaze(Mazearray,x-1,y-1,pathArray) == 1){ 
      return 1; 
     } 
     pathArray[x][y] == '0'; 
     return 0; 
    } 
    return 0; 
} 

MazeSolution()を実行すると、プログラムはエラーコード255とセグメント化で終了します私がデバッグしたとき、問題はrecursiveMaze()に現れます。

最初のif文からは実行されず、もう一つの問題は南北の制御点の間に戻ってきます。何時間もエラーを見つけることができませんでした。

ありがとうございます。ここで

+1

-gでコンパイルし、gdbで実行します(linuxでのasumming)。これは少なくとも失敗した線を表示します – pm100

+5

"西"が間違っています。それは厳密にy軸を調整する必要があります。 xではない。 'x-1、y-1'は効果的に対角線移動です。それにかかわらず、あなたの行列を構築するコードを組み込みます。事実上、あなたの問題を示す**完全な**例です。配列をロードするコードをボルケーグして、明らかに使用している4つのグローバル変数を準備すると、このコードを読むのは無意味です。 – WhozCraig

+1

あなたは本当に最後のリターンを必要としていますか?0。おそらく1を返すことができますか? (何も起こりませんので、すべてが良いですか?) – Grantly

答えて

2

は無限ループにつながる呼び出しシーケンスです:

recursiveMaze(M, x, y, p) 
    recursiveMaze(M, x-1, y, p) 
     recursiveMaze(M, x-1, y, p) -> run to completion 
     recursiveMaze(M, x+1, y, p) -> infinite loop 

秒再帰呼び出しでは、あなたがとる最初の再帰呼び出し、デクリメントされた値をバックインクリメントので、それが無限大でありますあなたは最初の呼び出しと同じ状態に戻ります。