# define m2 50
# define n2 50
# define maxlen 200 /*栈长度*/
# define true 1
# define false 0
# define null 0
# include "stdio.h"
# include "graphics.h"
# include "stdlib.h"
# include "dos.h"
int m,n;
typedef strUCt
{ int x,y,dir;}elemtype;
typedef struct
{ elemtype stack[maxlen];
int top;
}sqs;
typedef struct
{ int dx,dy;}moved;
void inimaze (int maze[][n2])
{ int i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)maze[i][j]=rand()/16383;
}
for (i=0,j=0;i<=m+1;i++)
maze[i][j]=1;
for (i=0,j=n+1;i<=m+1;i++)
maze[i][j]=1;
for (i=0,j=0;j<=n+1;j++)
maze[i][j]=1;
for (i=m+1,j=0;j<=n+1;j++)
maze[i][j]=1;
}
void picture (int maze[][n2])
{
int i,j;
setbkcolor(BLACK);
for(i=0;i<m+2;i++)
{ for (j=0;j<n+2;j++)
{ if(maze[i][j]==1)
{ setfillstyle(1,LIGHTBLUE);
bar (70+j*20,20+i*20,88+j*20,38+i*20);
}
else
{ setfillstyle(1,WHITE);
bar (70+j*20,20+i*20,88+j*20,38+i*20);
}
}
}
outtextxy(90,460,"press any key to start");
getch();
}
void inimove(moved move[])
{ move[0].dx=0;move[0].dy=0;
move[1].dx=0;move[1].dy=1;
move[2].dx=1;move[2].dy=1;
move[3].dx=1;move[3].dy=0;
move[4].dx=1;move[4].dy=-1;
move[5].dx=0;move[5].dy=-1;
move[6].dx=-1;move[6].dy=-1;
move[7].dx=-1;move[7].dy=0;
move[8].dx=-1;move[8].dy=1;
}
void inistack(sqs *s)
{ s->top=-1;}
int push(sqs *s,elemtype t)
{ int i,j;
if (s->top==maxlen-1)return(false);
else
{
i=t.x;j=t.y;
setfillstyle(1,GREEN);
bar (70+j*20,20+i*20,88+j*20,38+i*20);
s->stack[++s->top]=t;
return(true);
}
}
elemtype pop(sqs *s)
{ elemtype elem;
if (s->top<0)
{
elem.x=null;
elem.y=null;
elem.dir=null;
return(elem);
}
else
{ int i,j;
i=s->stack[s->top].x;j=s->stack[s->top].y;
setfillstyle(1,RED);
bar (70+j*20,20+i*20,88+j*20,38+i*20);
s->top--;
return(s->stack[s->top+1]);
}
}
void path(int maze[][n2],moved move[],sqs *s)
{ int i,j,dir,x,y,f;
elemtype elem;
i=1;j=1;dir=0;
maze[1][1]=0;
do
{ x=i+move[dir].dx;
y=j+move[dir].dy;
if (maze[x][y]==0)
{ elem.x=x;elem.y=y;elem.dir=dir;
f=push(s,elem);
delay(15000);
if (f==false) printf("栈长度太短");
i=x;j=y;dir=0;maze[x][y]=-1;
}
else
{ if (dir<9) dir++;
else
{
elem=pop(s);
if (elem.x!=null)
{
i=elem.x;
j=elem.y;
dir=elem.dir+1;
}
}
}}while(!((s->top==-1)&&(dir>=7)(x==m)&&(y==n)&&(maze[x][y]==-1)));
if(s->top==-1)
printf(" !!! no pass !!! ");
else { elem.x=x;elem.y=y;elem.dir=dir;
f=push(s,elem);
setfillstyle(1,GREEN);
bar (70+j*20,20+i*20,88+j*20,38+i*20);
getch();
}
}
void start()
{ int h;
for(h=5;h<=18;h++)
{
setfillstyle(1,h);
bar (80,80,520,180);
setcolor(h+2);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
outtextxy(150,90,"!WELCOME TO MAZE!");
delay(15000);
}
for(h=0;h<13;h++)printf(" ");
settextstyle(SMALL_FONT,HORIZ_DIR,6);
setcolor(LIGHTCYAN);
printf(" ");printf(" ");
outtextxy(90,200,"input the length of the maze(0-30):");
scanf("%d",&m);
for(h=0;h<2;h++)printf(" ");
printf(" ");printf(" ");
outtextxy(90,250,"input the wideth of the maze(0-30):");
scanf("%d",&n);
}
void main()
{
sqs *s;
int maze[m2][n2];
moved move[8];
initgraph(VGA,VGAHI,"");
start();
system("cls");
inimaze(maze);
picture(maze);
s=(sqs*)malloc(sizeof(sqs));
inistack(s);
inimove(move);
path(maze,move,s);
getch();
}