看下这C++的编辑错误啊
#include<iostream>using namespace std;
#define STACKINITSIZE 100
#define STACKINCREMENT 10
int maze[20][20]; //全局变量,迷宫地图
class postype //通道块类型
{
public:
int x; //横坐标
int y; //纵坐标
};
class selemtype //栈的元素类型
{
public:
int ord; //通道在路径上的序号
postype seat; //通道在迷宫中“坐标位置”
int di; //从此通道走向下一通道的“方向”
};
class stack //栈类,用来存放求解的迷宫路径
{
public:
selemtype*base; //栈底指针
selemtype*top; //栈定指针
int stacksize; //栈的存储空间
stack(); //栈的构造函数
bool pass(postype p); //当位置可以通过,即是未曾走过的通道块
void footprint(postype p); //留下足迹
postype nextpos(postype p,int d); //方向
bool stackempty(stack s); //判断栈是否为空
void markprint(postype p); //不能通过的标记
void pop(stack &s,selemtype &e); //出栈操作
void push(stack &s,selemtype e); //入栈操作
bool mazepath(stack s,int maze[20][20],postype start,postype end);
//迷宫的路径
};
stack::stack() //栈的构造函数
{
base=new selemtype[STACKINITSIZE]; //给栈开辟STACKINITSIZE个空间
if(!base)
{
cout<<"动态存储分配失败!"<<endl;
exit(1); //退出程序
}
top=base; //如果分配失败,将栈定指针指向栈底指针,即构造一个空栈
stacksize=STACKINISIZE; //将STACKINISIZE的值赋给栈的成员变量stacksize,初始值为100
}
bool stack::pass(postype p) //当前位置可以通过,即是未曾走过的通道块
{
if(maze[(p.x)][(p.y)]==1)return 1; //设置未曾走过的通道块在二维数组中的值为1
else return 0;
}
void stack::footprint(postype p) //留下足迹
{
maze[p.x][p.y]=2; //设置已走过的通道块的值为2
}
postype stack::nextpos(postype p,int d)
{
if(d==1)p.x++; //东
else if(d==2)p.y++; //南
else if(d==3)p.x--; //西
else p.y--; //北
return p;
}
bool stack::stackempty(stack s) //判断栈是否为空
{
if(s.base==s.top)return true; //栈定指针指向栈底时,栈为空,返回真
else return false; //栈不空,返回假
}
void stack::markprint(postype p) //不能通过的标记
{
maze[p.x][p.y]=0; //将此通道块的值设置为0,表示墙
}
void stack::pop(stack &s,selemtype &e) //出栈操作
{
if(s.top==s.base)cout<<"栈已空!"<<endl; //判断栈是否为空
e=*--s.top; //将栈顶指针减1后,用e带回栈底指针指向元素的值
}
void stack::push(stack &s,selemtype e) //入栈操作
{
if(s.top-s.base>=s.stacksize) //如果栈满
{
s.base=(selemtype*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(selemtype));
//追加空间
if(!s.base)exit(1); //如果存储分配失败,则退出程序
s.top=s.base+s.stacksize; //指针重定位
s.stacksize+=STACKINCREMENT; //将stacksize的值修改为s.stacksize+
// STACKINCREMENT的值
}
*s.top++=e; //将e的值赋给*s.top,并将Top指针的值加1
}
bool stack::mazepath(stack s,int maze[20][20],postype start,postype end)
//求解迷宫路径
{
postype curpos; //定义postype型对象curpos,用来表示当前所在的通道块
curpos.x=start.x; //curpos的初始值为入口,即当前位置在入口
curpos.y=start.y;
int curstep=1; //定义步数变量curstep,初始值为1,即表示开始在入口
selemtype e; //定义 栈元素对象e
do //用do_while循环来求解迷宫路径
{
if(pass(curpos)==1) //当前位置可以通过,即是未曾走过的通道块
{
footprint(curpos); //留下足迹
e.ord=curstep; //通道块在路径的序号为curstep,即所走的步数
e.seat.x=curpos.x; //将当前通道块在maze数组中的位置赋给e的seat,即当前通道块在迷宫地图的位置
e.seat.y=curpos.y;
e.di=1; //从此通道块走向下一通道块的“方向”
push(s,e); /*将当前位置插入栈顶 */
if(curpos.x==end.x &&curpos.y==ed.y) //若该位置时出口,则找到了通向出口的路径
{
while(!stackempty(s)) //打印路径
{
pop(s,e); //此时栈中存放的元素是通向出口的通道块序列
cout<<"第"<<e.ord<<""<<"步的"; //打印步数
cout<<"位置为:("<<e.seat.x<<",".y<<")"<<endl;//打印通道块在迷宫中的位置
}
return 1; //有路径,返回真
}
curpos=nextops(curpos,1); //如果当前位置不是出口,则切换当前位置的东邻方块为新的当前位置
curstep++; //将步数加1
}
else //如果当前位置不通
{
if(!stackempty(s)) //若栈不为空
{
pop(s,e); //将栈元素出栈
while(e.di==4 &&!stackempty(s)) //若栈不空,但栈顶位置的四周均不可通过
{
markprint(e.seat); //留下不能通过的标记,即删去栈顶位置,直至找到一个可通过的位置
pop(s,e);
curstep--; //将步数减1
}
if(e.di<4) //若栈不空,且栈顶位置还有其他方向尚未搜索
{
e.di++; //换下一个方向搜索
push(s,e); //将此通道块入栈
curpos=nextpos(e.seat,e.di);//则设定新的当前位置在沿顺时针方向旋转找到的栈顶位置的下一邻块
}
}
}
}
while(!stackempty(s)); //do_while循环
cout<<endl;
cout<<"此迷宫无通向出口的路径!"<<endl<<endl; //循环结束后还未找到路径
return 0;
}
int main()
{
int i,j,n;
cout<<"请输入迷宫大小(用顶点个数n表示,最大顶点数为20):"<<endl;
cin>>n; //输入迷宫大小
for(i=0;i<n;i++)
{
maze[i][0]=0; //将迷宫的四周设置为墙
maze[i][n-1]=0;
for(j=0;j<n;j++)
{
maze[0][j]=0;
maze[n][j]=0;
}
}
cout<<"请输入迷宫方阵(四周已设置为墙,输入n-2的方阵,通道用1表示,墙用0表示):"<<endl;
for(i=1;i<n-1;i++) //输入迷宫地图
for(j=1;j<n-1;j++)
cin>>maze[i][j];
postype start,end; //定义通道块型对象入口与出口
cout<<"请输入入口的横纵坐标:"<<endl;
cin>>start.x>>start.y; //输入入口的位置
cout<<"请输入出口的横纵坐标:"<<endl;
cin>>end.x>>end.y; //输入出口的位置
stack s; //定义栈
cout<<endl;
cout<<"求解的迷宫路径为:"<<endl<<endl;
s.mazepath(s,mazepath,start,end); //迷宫路径函数
cout<<endl;
return 0;
}