2017-10-18 156 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 

,因为在第二递归调用,你增加背部那个曾在第一次循环调中减少的价值是无限的,这需要你回到最初的呼叫状态。