迷宫算法(经典广度优先搜索算法)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
经典广度优先搜索算法,用parentx,parenty存储上一步的位置,规范化使用队列和栈。
迷宫暂定为8*6,动态生成,四周为一圈障碍,出口坐标为(8,6)。
坐标的定义类似图形编程的屏幕坐标,横向为x分量,垂直为y分量,左上角为原点。
可以向8个方向试探。
源代码(TC下编译运行通过):
#include
#include
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define ROW 8 /*行列可自定*/
#define COLUM 10 /*行列可自定*/
#define OUT 8
#define STEPPED 2
#define MAXQSIZE 100
int maze[8][10]/*6行8列*/
={{1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,1,0,0,0,1},
{1,0,1,0,0,1,1,0,0,1},
{1,0,0,0,1,0,1,0,0,1},
{1,1,1,0,1,0,1,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,OUT,1},
{1,1,1,1,1,1,1,1,1,1}};/*此处只是给一个初始化的例子,可以删去,后面的代码可以动态生成迷宫*/
void CreateRandomMaze()/*随机生成迷宫(可能产生走不通的迷宫)*/
{
int i,j;
srand((int)time());/*设置随机数种子,产生真随机数*/
for(i=0;i { for(j=0;j { maze[i][j]=rand()%2;/*产生0~1的随机数*/ } } for(i=0;i { maze[0][i]=1; maze[ROW-1][i]=1; } for(i=0;i { maze[i][0]=1; maze[i][COLUM-1]=1; } maze[1][1]=0; maze[ROW-2][COLUM-2]=OUT;/*设置出口*/ } void printMaze()/*打印迷宫*/ { int i,j; /*clrscr();*//*这个是turbo C的清屏函数,可以替代或忽略*/ for(i=0;i { for(j=0;j { printf(" %d",maze[i][j]); } printf("\n"); } /*delay(1000);*/ } /*********************队列(非循环顺序队列)************************/ typedef struct { int x,y; int parentx,parenty; /*记录上一个节点即路径中前驱节点,方便最后输出*/ }QNode,*QueuePtr; typedef QNode ElemType; typedef struct SqQueue { ElemType * base; int front; int rear; }SqQueue;/*队列结构体*/ Status InitQueue(SqQueue *Q)/*初始化队列*/ { Q->base = (ElemType *)malloc(MAXQSIZE *sizeof(ElemType)); if(!Q->base) {exit(OVERFLOW);} Q->front = Q->rear = 0; return OK; } int QueueLength(SqQueue Q) { return Q.rear - Q.front; } Status QueueEmpty(SqQueue Q) { if(Q.front==Q.rear) {return TRUE;} return FALSE; } Status GetHead(SqQueue Q,ElemType *e) { if(Q.front==Q.rear) {return ERROR;} *e = Q.base[Q.front]; return OK; } Status EnQueue(SqQueue *Q,ElemType e) { if(Q->rear>MAXQSIZE-1)/*队列满*/ {return ERROR;} Q->base[Q->rear]=e; (Q->rear)++; return OK; }