我的任务是找到10X10迷宫中的最短路径。 我用N定义了大小,并在开始时尝试使用3X3和4X4大小进行调试以逐步检查,程序运行正常。 在此之后我试图放大尺寸,然后程序显示我这个并显示好像堆叠并且没有完成程序(最后我必须打印最短路径的值):
http://postimg.org/image/rsdzv3ugx/
这是我的代码。我不知道问题出在哪里。我不知道为什么3X3工作得很好而且更大的迷宫没有。
#include <stdio.h>
#define N 7
#define UP 12
#define DOWN 20
#define RIGHT 30
#define LEFT 40
void paragraph_4 ();
int get2Dmatrix (int arr[N][N],int i,int j);
int maze (int maze_arr[N][N],int counter,int i,int j,int direction);
int min(int y1,int y2,int y3,int y4);
int main ()
{
// int arr[10][10]={0};
// get2Dmatrix (arr,0,0));
paragraph_4();
return 0;
}
void paragraph_4 ()
{
int maze_matrix[N][N];
printf("Please enter information for 10 by 10 matrix\n");
get2Dmatrix(maze_matrix,0,0);
int min_length=maze (maze_matrix,0,0,0,DOWN);
if (min_length==(N*N)+1)
printf("No path\n");
else
printf("The shortest path length is %d\n",min_length-1);
}
int get2Dmatrix (int arr[N][N],int i,int j)
{
if (j==N)
{
i++;
j=0;
}
if (i==N)
return arr [N][N];
scanf ("%d",&arr[i][j]);
get2Dmatrix (arr,i,j+1);
if (i==0 && j==0)
return arr [N][N];
}
int maze (int maze_arr[N][N],int counter,int i,int j,int direction)
{
int x1=(N*N)+1,x2=(N*N)+1,x3=(N*N)+1,x4=(N*N)+1;// initialization to impossible steps.
counter++;
if (i==(N-1) && j==(N-1))// stop recursion conditions
return counter;
if (counter==(N*N)+1)
return ((N*N)+1);
if ((i<(N-1)) && (direction!=UP) && (maze_arr[i+1][j]==1))// go down
x1=maze(maze_arr,counter,i+1,j,DOWN);
if ((i>0) && (direction!=DOWN) && (maze_arr[i-1][j]==1))//go up
x2=maze(maze_arr,counter,i-1,j,UP);
if ((j<(N-1)) && (direction != LEFT) && (maze_arr[i][j+1]==1))//go right
x3=maze(maze_arr,counter,i,j+1,RIGHT);
if ((j>0) && (direction!= RIGHT) && (maze_arr[i][j-1]==1))//go left
x4=maze(maze_arr,counter,i,j-1,LEFT);
return min(x1,x2,x3,x4);//send 4 numbers for function and return the
}
// Get 4 numbers and return the lowest value.
int min(int y1,int y2,int y3,int y4)
{
if(y1==y2 && y2==y3 && y3==y4)
return y1;
else if (y1<=y2 && y1<=y3 && y1<=y4)
return y1;
else if (y2<=y1 && y2<=y3 && y2<=y4)
return y2;
else if (y3<=y1 && y3<=y2 && y3<=y4)
return y3;
else if (y4<=y1 && y4<=y2 && y4<=y3)
return y4;
}
答案 0 :(得分:0)
访问数组外部大小。另外:由于未使用get2Dmatrix()
的返回值,只需返回。
int get2Dmatrix (int arr[N][N],int i,int j) {
...
if (i==N) return arr [N][N]; // access arr [N][N] is UB
}
void get2Dmatrix (int arr[N][N],int i,int j) {
...
if (i==N) return;
}
当然,#define N 7
应为#define N 10
。
堆栈大小可能不足,但我不这么认为。暂时尝试static int maze_matrix[N][N];
将其移出筹码。
次要:if(y1==y2 && y2==y3 && y3==y4) return y1;
不需要,因为此条件会在下一个if (y1<=y2 && y1<=y3 && y1<=y4)
中被捕获。
检查scanf()
结果。
if (scanf ("%d",&arr[i][j]) != 1) Alert_BadInput();
通过所有这些递归,很惊讶你没有使用类似的东西:
int min4(int y1,int y2,int y3,int y4) {
return min2((y1 <= y2) ? y1 : y2, (y3 <= y4) ? y3 : y4);
}
int min2(int y1,int y2) {
return (y1 <= y2) ? y1 : y2;
}
次要:
// printf("Please enter information for 10 by 10 matrix\n");
printf("Please enter information for %d by %d matrix\n", N, N);
总而言之,除了UB,堆叠和IO错误之外,我还没有看到 吸烟枪。
嗯。我认为int min_length=maze (maze_matrix,0,0,0,DOWN);
应该从(maze_matrix,0,0,0, TBD);
开始,其中TBD
可能应为0。
此外:我 想 我有。代码使用direction
来确保迷宫的行走不会回到“它来自哪里”。但这确实不阻止盘旋:UP,RIGHT DOWN,LEFT,UP,RIGHT,......为了解决问题,代码可以为所访问的空间留下标记并使用它来防止循环。