谁能帮我看看我这个迷宫代码哪里有问题,运行结果一直出错。(C语言)
#include
#include
#include
#define true 1
#define false 0
#define Maxsize 100
typedef struct
{
int i;
int j;
int di;
}Site;
typedef struct
{
Site data[Maxsize];
int top;
}Sqstack;
void createmg(int **maze, int L, int R);
void printfmg(int **maze, int L, int R);
int mgpath();
void InitStack(Sqstack **L);
void DestoryStack(Sqstack **L);
int StackEmpty(Sqstack *L);
int Push(Sqstack **L, Site e);
int Pop(Sqstack **L);
Site GetPop(Sqstack *L, Site e);
int main()
{
mgpath();
return 0;
}
int mgpath()
{
int xi, yi, xe, ye, i, j, di, il, jl, n;
int **maze;
int L, R;
Site path[Maxsize], e;
Sqstack *s;
printf("请输入迷宫的长度和宽度 : ");
scanf("%d %d",&L, &R);
do
{
maze = (int **)malloc(sizeof(int*)*L);
}while(maze == NULL);
for(i=0;ido
{
*(maze + i) = (int *)malloc(sizeof(int)*R);
}while(maze+i == NULL);
}
createmg(maze, L, R);
printfmg(maze, L, R);
printf("请输入入口坐标 : ");
scanf("%d %d",&xi, &yi);
printf("请输入出口坐标 : ");
scanf("%d %d",&xe, &ye);
InitStack(&s);
e.i = xi;
e.j = yi;
e.di = -1;
Push(&s, e);
GetPop(s, e);
maze[xi][yi] = 0;
while(!StackEmpty(s))
{
GetPop(s, e);
i = e.i;
j = e.j;
if(e.di<4 && !StackEmpty(s))
{
e.di++;
switch(e.di)
{
case 0:il = i-1;jl = j;break;
case 1:il = i;jl = j+1;break;
case 2:il = i+1;jl = j;break;
case 3:il = i;jl = j-1;break;
}
if(maze[il][jl] == 1)
{
s->data[s->top].di = e.di;
e.i = il;
e.j = jl;
e.di = -1;
Push(&s, e);
maze[il][jl] = 0;
}
}
else
{
Pop(&s);
maze[e.i][e.j] = 1;
}
if(il == xe && jl == ye)
{
n = 0;
printf("一条迷宫路径如下:\n");
while(!StackEmpty(s))
{
GetPop(s, e);
path[n] = e;
n++;
Pop(&s);
}
if(n >= 0)
{
printf("(%d,%d)",path[n].i, path[n].j);
if(n>0)
printf("-->");
if((n+1)%5 == 0)
printf("\n");
}
return true;
}
}
printf("无解!");
DestoryStack(&s);
free(maze);
return false;
}
void createmg(int **maze, int L, int R)
{
int i, j, fi, fj;
for(i=0;ifor(j=0;jif(i==0 || j==0 || i==L-1 || j==R-1)
maze[i][j]=0;
else
maze[i][j]=1;
}
}
srand((unsigned)time(NULL));
for(i=(L+R)*2;i>0;i--)
{
fi = rand()%L;
fj = rand()%R;
maze[fi][fj] = 0;
}
}
void printfmg(int **maze, int L, int R)
{
int i, j;
printf(" ");
for(i=0;iprintf("%-2d",i);
printf("\n");
for(i=0;iprintf("%-2d",i);
for(j=0;jswitch(maze[i][j])
{
case 0:
printf("* ");
break;
case 1:
printf(" ");
break;
case 2:
printf("1 ");
break;
case 3:
printf("S ");
break;
case 4:
printf("E ");
break;
}
}
printf("\n");
}
}
void InitStack(Sqstack **L)
{
(*L) = (Sqstack *)malloc(sizeof(Sqstack));
(*L)->top = -1;
}
void DestoryStack(Sqstack **L)
{
free(*L);
}
int StackEmpty(Sqstack *L)
{
if(L->top == -1)
return true;
else
return false;
}
int Push(Sqstack **L, Site e)
{
if((*L)->top == Maxsize-1)
return false;
(*L)->top++;
(*L)->data[(*L)->top] = e;
return true;
}
int Pop(Sqstack **L)
{
if((*L)->top == -1)
return false;
(*L)->top--;
return true;
}
Site GetPop(Sqstack *L, Site e)
{
if(L->top != -1)
{
e = L->data[L->top];
return e;
}
}
求大家帮帮我这个可怜娃吧,在网上自己找资料,改了20多次,每一次成功的,已经放弃了。
Site GetPop(Sqstack *L, Site e);
改为
Site GetPop(Sqstack *L, Site *e);
还有在函数体中,对于 e 的赋值应该修改为:
*e = L->data[L->top];
Push 函数中,对于栈满的判断不正确
if (L->top == Maxsize)
改成
if (L->top == Maxsize - 1)
在 main 函数中,调用 mgpath() 函数时应该传递迷宫的长度和宽度 L 和 R 作为参数:
mgpath(L, R);