首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言迷宫有关问题

2013-08-04 
C语言迷宫问题/* 以下程序,求大神改错。谢谢拉!!! */#include stdio.h#include windows.h#define SIZE_

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

热点排行