基本思路
1.创建两个空队列LinkQueueX和LinkQueueX
2.将入口entreX和entryY分别压入队列LinkQueueX和LinkQueueX。
3.当队列不空
①取队头元素,出队
②for(mov=0;mov<8;mov++),即还存在可以探索的相邻的方向。
a.按照顺时针依次探索各个位置(X,Y)。
b.如果(posX,posY)是出口,则输出路径,返回。
c.如果(posX,posY)是没有走过的通路;
~设置标志位mark[posX][posY]=1。
~当前位置入队。
~记录前驱位置,方便输出路径。
代码及注释如下
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct Node
{
DataType data;
struct Node *link;
};
typedef struct Node*PNode;
struct Queue
{
PNode f;
PNode r;
};
typedef struct Queue *LinkQueue;
struct MAZE_STRU
{
int size;
int **data;
};
typedef struct MAZE_STRU Maze;
LinkQueue SetNullQueue_Link()//创建空队列
{
LinkQueue lqueue;
lqueue=(LinkQueue)malloc(sizeof(struct Queue));
if(lqueue!=NULL)
{
lqueue->f=NULL;
lqueue->r=NULL;
}
else
printf("Aloc failure!\n");
return lqueue;
}
int IsNullQueue_Link(LinkQueue lqueue)//判断队列是否为空
{
return (lqueue->f==NULL);
}
void EnQueue_Link(LinkQueue lqueue,DataType x)//入队操作
{
PNode p;
p=(PNode)malloc(sizeof(struct Node));//申请节点空间
if(p==NULL)
printf("Alloc Failure!\n");
else
{
p->data=x;//数据域赋值
p->link=NULL;//指针域赋值
if(lqueue->f==NULL)//空队列的特殊处理
{
lqueue->f=p;
lqueue->r=p;
}
else
{
lqueue->r->link=p;//插入队尾
lqueue->r=p;//修改队尾指针
}
}
}
void DeQueue_Link(LinkQueue lqueue)
{
PNode p;