先上代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 7
#define MAX 1024
//typedef int Elemtype;
typedef struct//路径方块查找方向的数据结构
{
int x;
int y;
}Direction;
typedef struct //路径方块的数据结构
{
int row;//路径方块横坐标
int column;//路径方块纵坐标
int direction;//从当前路径查找下一方块方向
}SElemType;
typedef struct SequenStack
{
SElemType data[MAX];
int top;
}SequenStack;
SequenStack *S;
typedef SElemType elemtype;
SequenStack *Init_SequenStack()//初始化栈
{
SequenStack *S;
S = (SequenStack*)malloc(sizeof(SequenStack));
S->top = -1;
return S;
}
int Push_SequenStack(SequenStack *S, elemtype x)//入栈
{
if (S->top >= MAX -1)
{
printf("栈满\n");//栈满不能入栈返回1;
return 1;
}
S->top++;
S->data[S->top] = x;
return 0;//入栈成功返回0;
}
int SequenStack_Empty(SequenStack *S)//栈判空
{
if (S->top == -1)
return 1;//空返回1
else
return 0;// 非空返回0
}
int GetTop_SequenStack(SequenStack *S,elemtype *x)//取栈顶元素
{
if (S->top == -1)
{
printf("栈空\n");//栈空返回1
return 1;
}
else
{
*x = S->data[S->top];//成功刚返回0;
return 0;
}
}
int Pop_SequenStack(SequenStack *S, elemtype *x)//出栈
{
if (S->top == -1)
{
printf("栈空\n");//栈空返回1
return 1;
}
else
{
S->top--;
*x = S->data[S->top + 1];
return 0;//出栈成功返回0;
}
}
int path(SequenStack *s,int Maze[SIZE][SIZE],Direction Move[5])
{
SElemType temp;
SElemType tryPath;
int x,y,d,i,j,tryTime;
temp.row=1;
temp.column=1;
temp.direction=0;
Push_SequenStack(s,temp);//将第一个路径方块如栈
while(!SequenStack_Empty(s))
{
GetTop_SequenStack(s,&temp);//取栈顶元素
x=temp.row;
y=temp.column;
d=temp.direction+1;//设置查找方向
tryTime=0;//设置当前路径方块查找次数
while(d<=4)//对当前路径方块四个方向查找
{
i=x+Move[d].x;//根据查找方向,设置相应方块坐标
j=y+Move[d].y;
if(Maze[i][j]==0)
{
if(tryTime==0)//设置探查方向
{
Pop_SequenStack(s,&tryPath);// 出栈当前路径方块
tryPath.direction=d; //更新方向
Push_SequenStack(s,tryPath);//重新入栈
tryTime++;
}
temp.row=i;
temp.column=j;
temp.direction=1;
Push_SequenStack(s,temp);
x=i;
y=j;
Maze[x][y]=-1;
if(x==SIZE-2&&y==SIZE-2)//判断当前方块是否为出口
{
return 1;
}
else
{
d=1;//继续探查
}
}
else//不可通过,查找下一个方向
{
d++;
tryTime=0;
}
}//while结束
if(d==5&&!SequenStack_Empty(s))
{
Pop_SequenStack(s, &temp);
Maze[x][y]='X';
}
}
return 0;
}
void main()
{
int a,i,j;
int maze[SIZE][SIZE];
srand((unsigned)time(NULL));
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
maze[i][j]=1;
}
}
for(i=1;i<SIZE-1;i++)
{
for(j=1;j<SIZE-1;j++)
{
if(i==1&&j==1)
maze[i][j]=0;
else
maze[i][j]=rand()%2;
}
}
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(maze[i][j]==1)
printf("■");
else
printf("□");
}
printf("\n");
}
printf("\n");
Direction Move[5]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
S=Init_SequenStack();
a=path(S,maze,Move);
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(i==1&&j==1)
printf("△");
else if(maze[i][j]==1)
printf("■");
else if(maze[i][j]==-1)
printf("△");
else
printf("□");
}
printf("\n");
}
if(a==1)
printf("成功找出\n");
else
printf("没有出路\n");
}
这是实验我是自己把它设置为随机数的形式,(自己输数太麻烦),主要函数也就是书上的,主要是把握栈的使用。。