// 迷宫求解.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
#define ok
#define error
#define true
#define false
#define stack_init_size  200
#define stackincrement   100
#define m 10
typedef struct {
  int x;//路径上的横坐标
  int y;//路径上的纵坐标
  int d;//下一通道的方向
}selemtype;//元素类型
typedef struct{
   selemtype    *base;
   selemtype    *top;
   int     stacksize;
}Sqstack;

int initstack(Sqstack &S){
    S.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
    if(!S.base)     return 0;
    S.top=S.base;         //空栈
    S.stacksize=stack_init_size;
    return 1;
}
int stackempty(Sqstack S){
    if(S.base==S.top)
        return 1;
    else
        return 0;
}
int push(Sqstack &S,selemtype a){  //插入新元素E作为新的栈顶元素
    if(S.top-S.base>S.stacksize)   {//栈满
        S.base=(selemtype*)realloc(S.base,(S.stacksize+stackincrement)*sizeof(selemtype));
        if(!S.base)   return 0;//分配失败
        S.top=S.base+S.stacksize;
    S.stacksize+=stackincrement;
    }
    *S.top++=a;
    return 0;
}//压栈
int pop(Sqstack &S){//若栈不空,则删除栈顶元素,并用E返回其值
    *S.top=*--S.top;
    return 0;
}
selemtype top(Sqstack S)
{
    return (*S.top);
}
void pushstack(Sqstack &S,int x,int y,int d){//把坐标和方向插入栈
   selemtype e;
   e.x=x;
   e.y=y;
   e.d=d;
   push(S, e);
}
void footprint(Sqstack S)
{
    selemtype e;
    cout<<"the revers path is:";
    while(!stackempty( S))
    {
        e=top(S);
        pop(S);
        cout<<e.x<<","<<e.y<<endl;
    }
}
void mazepath(int maze[][m],int d[][2],int x0,int y0,int x1,int y1)//x0,y0为起点,x1,y1为终点
{
  int i,j,a,b,k;
  Sqstack S;
  initstack(S);
  selemtype e;
  maze[x0][y0]=8;//第一步,并以8为标记
  pushstack(S,x0,y0,-1);//把初始点压栈
  do
  {
      e=top(S);
      pop(S);
      i=e.x;j=e.y;
      for(k=(e.d+1);k<=3;k++)//每个点的各个方向进行选择
      {
          [color=800000]a=i+d[k][1];b=j+d[k][0];[/color];//[color=000080]错误所在[/color]
          if(a==x1 && b==y1 && maze[a][b]==0)
          {            
              footprint(S);//走到出口,打出路径
              return ;
          }
          if(maze[a][b]==0)//没有经过此点
          {
              maze[a][b]=8;//做标记
              pushstack(S,i,j,k);
              i=a;j=b;k=-1;
          }//if
      }//for
  }while(!stackempty(S));
      cout<<"这样的路径不存在";
}
int main()
{
    char w;
    int d[][2]={0,1,1,0,-1,-1,0,0,1,1};
    int maze[][10]={
         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,
    };
    mazepath(maze,d,1,1,8,8);
    getchar();
    cin>>w;
    return 0;
}
错误为红色字体部分,就是调试的时候出现了访问地址出错,说是访问发生了冲突.是怎么回事哟,而且现在写程序也经常碰到写的程序访问地址出错的情况,但是每次都不知所措.