2017-10-18 158 views
2

我是C新手,試圖做一個迷宮問題,其中0和字母是通過點,1是障礙。我的2D迷宮數組低於起點在(0,4),每次我必須檢查4個方向(N,S,E,W),我也有路徑數組(最初包含「0」作爲字符)其中I會把路線爲「R」,這也是相同的大小:C遞歸分段錯誤

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

我使用遞歸溶液尋路和在總使用3的函數,它們在下面:

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和segmentati結束當我調試問題出現在recursiveMaze()函數。

因此,從第一條if語句開始,它不會執行,另一個問題是它會返回到南和北控制點之間。請幫助我找不到幾個小時的錯誤。

在此先感謝。

+1

用-g編譯並在gdb下運行(在linux上運行)。這將至少顯示失敗的線路 – pm100

+5

你的「西部」是錯誤的。應嚴格調整y軸;不是x。 'x-1,y-1'實際上是一個對角線移動。無論如何,包括你的代碼,建立你的矩陣;實際上是一個最小的**完整的**示例,可以證明您的問題。如果你使用加載數組的代碼並填充你顯然使用的四個全局變量,那麼閱讀這段代碼是沒有意義的。 – 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 

,因爲在第二遞歸調用,你增加背部那個曾在第一次循環調中減少的價值是無限的,這需要你回到最初的呼叫狀態。