C语言迷宫问题
/* 以下程序,求大神改错。谢谢拉!!! */
#include <stdio.h>
#include <windows.h>
#define SIZE_INIT_SIZE 10 //存储空间初始分配量
#define STACK_INCREMENT 10//存储空间分配增量
typedef struct//定义坐标结构体类型
{
int y;
int x;
}POS;
typedef struct//定义迷宫默认栈类型
{
int ord;
POS seat;
int di;
}ElemType;
typedef struct//定义结构体类型
{
ElemType *bese;//栈底指针
ElemType *top;//栈顶指针
int size;//当前已经分配的存储空间
}STACK;
int item[10][10]=//定义迷宫地图1为墙 0为通道
{
1,1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,0,1,0,1,
1,0,0,1,0,0,0,1,0,1,
1,0,0,0,0,1,1,0,0,1,
1,0,1,1,1,0,0,0,0,1,
1,0,0,0,1,0,0,0,0,1,
1,0,1,0,0,0,1,0,0,1,
1,0,1,1,1,0,1,1,0,1,
1,1,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,
};
int Ispass (POS Curp)//是否可以通过
{
return item[Curp.y][Curp.x] == 0? 1: 0;
}
POS NextPos(POS Curp,int di)//方向判断
{
POS p = Curp;
switch (di)
{
case 0 : p.x--; break;
case 1 : p.y++; break;
case 2 : p.x++; break;
case 3 : p.y--; break;
}
return p;
}
void PrintItem (POS Curp)//输出地图
{
int i,j;
system("cls");
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
if (i == Curp.y && j == Curp.x)
{printf("@");
continue;
}
if (item[i][j] == 1)
printf("#");
else
printf(" ");
}
printf("\n");
}
system("pause");
}
static const POS inpos = {1,1},outpos = {8,8};//定义迷宫 出口 和 入口
STACK *InitStack()//构造一个空栈S
{
STACK *s=(STACK *)malloc(sizeof(STACK));//为S申请内存空间
if (s == NULL)//检查是否申请成功
exit(0);
s->bese = (ElemType *)malloc(SIZE_INIT_SIZE * sizeof(ElemType));//为栈申请空间
if (s->bese == NULL)//检查是否申请成功
exit(0);
s->top = s->bese;//初始化栈顶指针的地址
s->size = SIZE_INIT_SIZE;//初始化已经分配多少空间
return s;//返回s地址
}
void DestroyStack(STACK *s)//销毁栈
{
free(s->bese);//释放栈空间
free(s);//释放结构体空间
}
int Push(STACK *s, ElemType *e)//入栈
{
if (s == NULL || e == NULL)//检查参数
return 0;
if (s->top - s->bese >= s->size)//检查栈内存空间
{
s->bese = (ElemType *)realloc(s->bese, ((s->size + STACK_INCREMENT) * sizeof(ElemType)));
//申请更多的空间
if (s->bese == NULL)//检查申请是否成功
return 0;
s->top = s->bese + s->size;//重新初始化top
s->size = s->size + STACK_INCREMENT;//重新初始化空间大小
}
s->top = e;//将e的值赋给栈顶
s->top++;//栈顶指针后移
return 1; //返回成功入栈
}
int Pop(STACK *s,ElemType *e)//出栈
{
if (s == NULL || e == NULL)//判断参数正确性
return 0;
if (s->bese == s->top)//检查是否为空栈
return 0;
s->top--;//栈顶指针前移
*e = *s->top;//栈顶指针指向的地址值赋给e
return 1; //成功出栈
}
int IsEmpty(STACK *s)//检查是否为空栈
{
return s->top==s->bese? 1: 0;//返回
}
int main()//主函数
{
POS CurPos = inpos;//入口地址赋给 CurPos
STACK *s = InitStack();//初始化栈
ElemType e;//定义结构体
int setp = 1;//统计步数
PrintItem(inpos); //输出初始地图
do
{
if (Ispass(CurPos))//判断是否通过
{
e.ord = setp;
e.di = 0;
e.seat = CurPos;
Push(s,&e);
item[CurPos.y][CurPos.x] = 2;
if (e.seat.y == outpos.y && e.seat.x == outpos.x)
{
printf("OK");
break;
}
PrintItem(CurPos);
system("pause");
CurPos = NextPos(CurPos,e.di);
setp ++;
}
else
{
Pop(s,&e);
while (e.di == 4 && !IsEmpty(s))
{
item[CurPos.y][CurPos.x] = 3;
Pop(s,&e);
}
if (e.di <= 3)
{
e.di++;
Push(s,&e);
CurPos = NextPos (e.seat,e.di);
}
}
}while(!IsEmpty(s));
}
C
[解决办法]
http://learn.akae.cn/media/ch12s03.html