#include<iostream.h>
#include<string.h>
#define STACK_INIT_SIZE 20     //储存空间初始分配量
#define M 10
#define N 10

typedef enum{
    RIGHT,RIGHTDOWN,DOWN,LEFTDOWN,LEFT,LEFTUP,UP,RIGHTUP
}Direction;

typedef enum{
    YES,NO
}MarkTag;

typedef struct position   //迷宫中位置的坐标

   int x;
   int y;
}Position;

typedef struct SElemType
{
  int order;          //当前位置在路径中的序号
  Position seat;       //当前位置在迷宫中的坐标
  Direction di;       //从当前位置走到下一位置的方向
}SElemType;              //栈元素的类型

typedef struct Stack

  SElemType *base,*top;
  int stacksize;
}Stack;

int InitStack(Stack &S) //初始化栈的函数
{//构造一个空栈
 S.base=(SElemType *)new int(STACK_INIT_SIZE);   //为S.base分配空间大小为20*2字节空间
 if(!S.base) return true;  //如果S.base 为空推出。
 S.top=S.base; //不为空时则S.top=S.base.    S.stacksize就赋值为20
 S.stacksize=STACK_INIT_SIZE;
 return true;  //返回1
}

int Push(Stack &S,SElemType e)     //元素e入栈
{
    if(S.top-S.base>=S.stacksize)
        return false;
    *S.top++ =e; //S为对象,其属性top为指针先算 *S.top=e; 再 S.top++
    return true;
}

int Pop(Stack &S,SElemType &e) //栈顶元素出栈,由e带回栈顶元素
{
    if(S.top==S.base)
        return false;
    e=*--S.top;   //S为对象,其属性top为指针先算 *S.top=e; 再 S.top++
    return true;
}

 int Empty(Stack S)    //判断栈是否为空

    if(S.top==0)
        return true;
    else
        return false;


int CreateMaze(Position startpos,Position endpos)

{
    Position start,end;

cout<<"请输入迷宫入口的位置:";

 cin>>start.x>>start.y;

cout<<"请输入迷宫出口的位置:";

 cin>>end.x>>end.y;

     startpos=start; endpos=end;

 return true;

}  //createMaze


char maze[M+2][N+2]={

 {'1','1','1','1','1','1','1','1','1','1','1'},

 {'1','0','1','0','0','1','1','1','0','0','1'},

 {'1','0','0','0','0','0','1','0','0','1','1'},

 {'1','0','1','1','1','0','0','0','1','1','1'},

 {'1','0','0','0','1','0','1','1','0','1','1'},

 {'1','1','0','0','1','0','1','1','0','0','1'},

 {'1','1','1','0','0','0','0','0','0','0','1'},

 {'1','1','1','1','1','1','1','1','1','1','1'}

 };    //用二维字符数组表示迷宫

int Pass(Position curpos)
{
    if(maze[curpos.x][curpos.y]=='0')
        return true;
    else
        return false;
}

void MarkPos(Position curpos,MarkTag tag)        //为已经探索过的位置加标记
{
    if(tag=YES)
        maze[curpos.x][curpos.y]='.';//可以通过的路径标记
    else
        maze[curpos.x][curpos.y]='#';   //不可以通过的路径标记
}

//根据当前的位置坐标和下一步要探索的方向dir求下一步要走的位置坐标
Position NextPos(Position curpos,Direction di)
{    Position nextpos;
switch(di)

  {
     case RIGHT:nextpos.x=curpos.x;nextpos.y =curpos.y+1; break;
     case RIGHTDOWN:nextpos.x=curpos.x+1;nextpos.y=curpos.y+1; break;
     case DOWN :nextpos.x=curpos.x+1;nextpos.y =curpos.y; break;
     case LEFTDOWN:nextpos.x=curpos.x+1;nextpos.y=curpos.y-1; break;
     case LEFT :nextpos.x=curpos.x;nextpos.y =curpos.y-1; break;
     case LEFTUP:nextpos.x=curpos.x-1;nextpos.y=curpos.y-1; break;
     case UP :nextpos.x=curpos.x-1;nextpos.y =curpos.y; break;
     case RIGHTUP:nextpos.x=curpos.x-1;nextpos.y=curpos.y+1; break;     
  }
  return nextpos;
}

Direction NextDir(Direction di)
{  switch(di)
  {   
      case RIGHT: return RIGHTDOWN;
      case RIGHTDOWN : return DOWN;
      case DOWN: return LEFTDOWN;
      case LEFTDOWN: return LEFT;
      case LEFT: return LEFTUP;
      case LEFTUP:return UP;
      case UP: return RIGHTUP;
  }
return di;
}


int MazePath(Stack S,Position start,Position end)
{//若迷宫中存在从入口start到出口end的通道,则求得一条存放在栈S中(从栈底到栈顶),并返回true;若迷宫中不存在从入口start到出口end的通道,则返回false
    Position curpos;
    SElemType e;
    int curstep=1;    //探索第一步
        if(InitStack(S)==false)
            return false;
        curpos=start;    //设定“当前位置”为“入口位置”
        do{
            if(Pass(curpos)){     //当前位置可以通过
                MarkPos(curpos,YES);    //留下足迹
                e.order=curstep,e.seat=curpos,e.di=RIGHT;
                Push(S,e);      //当前位置加入到路径,入栈
                if(curpos.x==end.x&&curpos.y==end.y)  //当前位置是出口
                    return true;
                curpos=NextPos(curpos,RIGHT);     //下一位置是当前位置的东邻,即右边
                curstep++;      //探索下一步
            }
            else{    //当前位置不能通过
                if(!Empty(S)){
                    Pop(S,e);
                    while(!Empty(S)){
                        //八个方向都试探过,没有找到通路,只能回朔
                        curpos=e.seat;
                        MarkPos(curpos,NO);
                    }//while
                    if(e.di==RIGHTUP){//八个方向还没有探索完成
                        e.di=NextDir(e.di);
                        Push(S,e);   //换下一个方向探索
                        curpos=NextPos(e.seat,e.di);
                    }//if
                }//if
            }//else
        }while(!Empty(S));
            return false;
}
                        

void main()
{
    Position startpos,endpos;
    Stack path;
    int i,j;
    SElemType e;
    if(CreateMaze(startpos,endpos)==false)
        return ;
    MazePath(path,startpos,endpos);
    while(!Empty(path)){     //输出出口到入口的路径
        Pop(path,e);
        cout<<e.seat.x<<e.seat.y;
    }
    //输出迷宫的图形
    cout<<endl;
    for(i=0;i<=12;i++)
    {
        for(j=0;j<=12;j++)
            cout<<maze[i][j]<<endl;
    }
}


编译之后提示有三个警告,但是多编译几次的话,就会没有错误和警告。然而执行的时候,就会遇到错误弹出窗口!不晓得哪里有问题了!求哪位高手帮个忙,或者我加你QQ,我还有很多不懂的地方想请教!谢谢...