C递归分段错误
问题描述:
我是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语句开始,它不会执行,另一个问题是它会返回到南和北控制点之间。请帮助我找不到几个小时的错误。
在此先感谢。
答
这里是通向无限循环调用序列:
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
,因为在第二递归调用,你增加背部那个曾在第一次循环调中减少的价值是无限的,这需要你回到最初的呼叫状态。
用-g编译并在gdb下运行(在linux上运行)。这将至少显示失败的线路 – pm100
你的“西部”是错误的。应严格调整y轴;不是x。 'x-1,y-1'实际上是一个对角线移动。无论如何,包括你的代码,建立你的矩阵;实际上是一个最小的**完整的**示例,可以证明您的问题。如果你使用加载数组的代码并填充你显然使用的四个全局变量,那么阅读这段代码是没有意义的。 – WhozCraig
你确定你需要最后一次返回0 ....可能会返回1吗? (因为什么都没有发生,所以一切都好?) – Grantly