各位,谁有迷宫的源程序呀,本人是用的是VC6.0的编译器,希望是那种能够运行没有错误的!
本人不是为了交什么作业才要的,而是前些时候自己看过书之后自己尝试着写程序,可每次都错误百出,没有信心,而且也找不到能够帮忙解决的人,所以觉得可能还是读懂别人写好的程序是个捷径,不知道我这想法对不!
/* map
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
*/
#include <iostream>
#include <malloc.h>
#include <cstdlib>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
int Maze[10][10];
typedef struct{
int x;
int y;
} PosType;
typedef struct{
int ord;
PosType seat;
int di;
} SElemType;
typedef int Status;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
Status InitStack(SqStack &s); //构造一个空栈
Status DestroyStack(SqStack &s); //销毁栈
Status ClearStack(SqStack &s);//清空栈
Status StackEmpty(SqStack s); //判断栈是否为空
int StackLength(SqStack S);//求栈长
Status GetTop(SqStack s,SElemType &e);//取得栈顶元素
Status Push(SqStack &s,SElemType &e);//入栈
Status Pop(SqStack &s,SElemType &e); //出栈
Status Pass(PosType s); //判断可过
PosType NextPos(PosType,int); //下个方位
void FootPrint(PosType); //留下足迹
void MarkPrint(PosType); //标记不可到达
int main()
{
SqStack L;
InitStack(L);
int curstep;
char c='#';
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
cin>>Maze[i][j];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(Maze[i][j]==1)
cout<<c;
else cout<<" ";
cout<<endl;
}
int z;
SElemType e,*k;
PosType start,end,curpos;//起点 终点 当前位置
start.x=1;
start.y=1;
end.x=1;
end.y=8;
curpos=start;
curstep=1;
do{
/*for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(Maze[i][j]==1)
cout<<c;
else cout<<" ";
cout<<endl;
}
cin>>z;*/
if(Pass(curpos)) //如果当前位置可达
{
e.ord=curstep;
e.seat=curpos;
e.di=1;
FootPrint(curpos);
Push(L,e);
if(curpos.x==end.x&&curpos.y==end.y)
break;
curpos=NextPos(curpos,1);
curstep++;
}
else //如果当前位置不可达
{
if(!StackEmpty(L))
{
Pop(L,e);
while(e.di==4&&!StackEmpty(L))
{
MarkPrint(e.seat);
Pop(L,e);
}
if(e.di<4)
{
e.di++;
Push(L,e);
curpos=NextPos(e.seat,e.di);
}
}
}
}
while(!StackEmpty(L));
if(!StackEmpty(L))
{
for(k=L.base;k!=L.top;k++)
cout<<k->seat.x<<","<<k->seat.y<<" ";
cout<<endl;
}
else cout<<"I can't reach there."<<endl;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(Maze[i][j]==1)
cout<<c;
else if(Maze[i][j]==2)
cout<<"!";
else if(Maze[i][j]==3)
cout<<"$";
else cout<<" ";
}
cout<<endl;
}
return 0;
}
Status Pass(PosType s)
{
if(Maze[s.x][s.y]==0)
return TRUE;
else return FALSE;
}
PosType NextPos(PosType s,int b)
{
PosType e;
switch(b){
case 1:e.x=s.x;e.y=s.y+1;break;
case 2:e.x=s.x+1;e.y=s.y;break;
case 3:e.x=s.x;e.y=s.y-1;break;
case 4:e.x=s.x-1;e.y=s.y;break;
}
return e;
}
void FootPrint(PosType t)
{
Maze[t.x][t.y]=3;
}
void MarkPrint(PosType t)
{
Maze[t.x][t.y]=2;
}
Status InitStack(SqStack &s)
{
s.base=(SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!s.base)
exit(OVERFLOW);
s.stacksize=STACK_INIT_SIZE;
s.top=s.base;
return OK;
}
Status DestroyStack(SqStack &s)
{
if(!s.base)
return ERROR;
free(s.base);
SqStack *p=&s;
free(p);
return OK;
}
Status ClearStack(SqStack &s)
{
if(!s.base)
return ERROR;
s.top=s.base;
return OK;
}
Status StackEmpty(SqStack s)
{
if(!s.base)
return ERROR;
if(s.base==s.top)
return TRUE;
else return FALSE;
}
int StackLength(SqStack s)
{
return s.top-s.base;
}
Status GetTop(SqStack s,SElemType &e)
{
if(StackEmpty(s))
return ERROR;
e=*--s.top;
return OK;
}
Status Push(SqStack &s,SElemType &e)
{
if(!s.base)
return ERROR;
if(StackLength(s)==s.stacksize)
{
s.base=(SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status Pop(SqStack &s,SElemType &e)
{
if(StackEmpty(s))
return ERROR;
e=*--s.top;
return OK;
}