我是 C 的新手,并试图做一个迷宫问题,其中 0 和字母是传递点,1 是障碍。
我的 2D 迷宫数组位于起点 (0,4) 下方,每次我都必须检查 4 个方向(N、S、E、W),我还有路径数组(最初包含"0"作为字符),我将路线作为"R",大小也相同:
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和分段错误。当我调试时,问题出现在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
它是无限的,因为在第二个递归调用中,您将递减在第一个递归调用中递减的值递回,这会将您带回与初始调用相同的状态。