迷宫问题,大家帮我修改下!!!
#define ok 1#define error 0
#define overflow -1
#define size sizeof(struct Sqlist)
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//自己建立一个迷宫
/*int Creat(int migong[8][8])
{
//建立一个迷宫,其中只有0和1,1表示墙0表示通道
//定义一个二维数组
int i,j;
printf("现在请你建立自己的迷宫,输入 64个数字:"\n)
for (i=0;i<8;i++)
for(j=0;j<8;j++)
scanf("%d",&migong[8][8]);
//输出迷宫
for(i=0;i<8;i++)
for(j=0;j<8;j++)
printf("%2d",migong[8][8]);
}*/
//由于当你走错路时必须按原路返回,所以必须先后进先出。所以我们在这里定义栈元素类型
typedef struct MStackElem{
//在这里把迷宫的墙和通道在二维空间中定义坐标方便表示
int x; //x坐标表示上下
int y; //y坐标表示左右
int val; //migong[x][y]的值
}MStackElem;
//栈的定义
typedef struct Sqlist{
MStackElem *top;
MStackElem *base;
int stacksize;
}Sqlist;
//构建一个空栈
int InitStack(Sqlist *S)
{
S->base=(MStackElem*)malloc(STACK_INIT_SIZE*sizeof(size));//开辟一个空间
if(!S->base)exit(overflow);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return ok;
}
MStackElem getTop(Sqlist *s){
if (s->top == s->base) {//判断栈是否为空,
printf("in getTop(),empty stack! exit now. ");
exit(error);
}
else {
return *(s->top - 1);
}
}
int Push(Sqlist *S,MStackElem e)
{
if(S->top-S->base>=S->stacksize){
//如果栈满了,我们在这里追加存储空间
S->base=(MStackElem*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return ok;
}
//删除栈顶元素
int Pop(Sqlist &S)
{
if(S.top==S.base)return error;
*--S.top;
return ok;
}
//下面就是关于走出迷宫的具体操作
//构建两个栈,一个保存探索路径,一个保存可以走出去的路径
Sqlist way,realway;
//判断位置以前是否走过
int unPass(Sqlist way,MStackElem ls)
{
int flag=1;//先设置flag=1,如果已经走过了就变为0
while(way.top!=way.base)
{
MStackElem e=*(way.top-1);
if(e.x==ls.x&&e.y==ls.y)
{
flag=0;
}
(way.top)--;
}
return flag;
}
//从东面开始走
MStackElem ESET(MStackElem ls)
{
if(ls.y!=7){//当y==7的时候由于到达了迷宫边界就不能在走动了
ls.y++;//在坐标上向右走的情况
ls.val=migong[ls.x][ls.y];
}
return ls;
}
//想南面走的情况
MStackElem SOUTH(MStackElem ls)
{
if(ls.x!=7){
ls.x++;
ls.val=migong[ls.x][ls.y];
}
return ls;
}
//向西面走的情况
MStackElem WEST(MStackElem ls)
{
if(ls.x!=0){
ls.x--;//在坐标中向左走
ls.val=migong[ls.x][ls.y];
}
return ls;
}
//获得北面的位置
MStackElem getNorth(MStackElem ls)
{
if(ls.y!=0){
ls.y--;//在坐标上向下走的情况
ls.val=migong[ls.x][ls.y];
}
return ls;
//做进一步的尝试
MStackElem getNext(MStackElem ls)
{
MStackElem next;
next.x=next.y=next.val=-1;
if(ESET(ls).val!=0&&unPass(way,ESET(ls))){//如果没通过则向其他方向走走看
next=ESET(ls);
}
else if(SOUTH(ls).val!=0&&unPass(way,SOUTH(ls))){
next=SOUTH(ls);
}
else if(WEST(ls).val!=0&&unPass(way,WEST(ls))){
next=WEST(ls);
}
else if(getNorth(ls).val!=0&&unPass(way,getNorth(ls))){
next=getNorth(ls);
}
return next; //如果都已经走过,则返回-1
}
//得出迷宫的路径
int getMazeWay()
{
MStackElem start,end,ls;
start.x=0;
start.y=0;//开始的时候是从入口开始
start.val=migong[start.x][start.y];//开始路径
end.x=7;
end.y=7;
end.val=migong[end.x][end.y];//结束路径
ls=start;//设定入口位置
do{
if(unPass(way,ls)){//如果当前位置为走到时
Push(&realway,ls);
Push(&way,ls);
ls=getNext(ls);
if(start.x==end.x&&start.y==end.y){
//已经到达出口,跳出循环
Push(&realway,ls);
Push(&way,ls);
return true;
}
else if(ls.val==-1){//当四面都是障碍物或者都已经走过
//删除栈顶元素
Pop(realway);
ls=getTop(&realway);
}
else{ //说明以前的方向都不对,现在尝试其他方向
ls=getNext(ls);
if(ls.val==-1){
Pop(realway);
ls=getTop(&realway);
}
}
}while(ls.x!=end.x&&ls.y!=end.y);
}
void printlujing(Sqlist *S)
{
MStackElem e;
while(S->base<S->top-1){
e=*(S->base);
printf("migong[%d][%d]------>:",e.x,e.y);
(S->base)++;
}
e=*(S->base);
printf("migong[%d][%d]........\n恭喜你,你已成功走出迷宫!",e.x,e.y);
}
int main()
{
InitStack(&way);
InitStack(&realway);
huodelujing();
printf("The path of through the maze is:\n\n");
printlujing(&realway);
return 0;
}
我想自己输入迷宫,但是不知道怎么回事,不能成功!!大家修改下我的代码吧