求解迷宫的最短路径问题 数据结构队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
using namespace std;
#define MaxSize 50

int mg[10][10]=
{
{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},
};

struct Box
{
int i,j,pre;
};
struct QuType
{
Box data[MaxSize];
int front,rear;
};

void print(QuType qu,int front)
{
int k=front,j,ns=0;
do //反向找到最短的路径,将该路径上的方块的pre成员设置成 -1
{
j = k;
k = qu.data[k].pre;
qu.data[j].pre = -1;
}while(k!=0);

cout<<"迷宫路径如下:"<k=0;
while(k{
if(qu.data[k].pre==-1)
{
ns++;
cout<<"("<if(ns%5 == 0)
{
cout<}
}
k++;
}
cout<}
bool mgpath(int xi,int yi,int xe,int ye)
{
int i,j,di; //定义下标
bool find=0;
QuType qu; //定义数据类型为QuType 的 qu
qu.front=qu.rear=-1; //初始化队头指针和队尾指针
qu.rear++;
qu.data[qu.rear].i = xi; //把入口 坐标赋给 顺序队列
qu.data[qu.rear].j = yi;
qu.data[qu.rear].pre = -1;
mg[xi][yi] = -1; //把入口坐标 赋值为-1 避免重复索引
while(qu.front!=qu.rear && !find) //如果队尾和队头指针不相同 且 发现新的方向 进行循环
{
qu.front++; //出队 但是仍然在队列之中
i = qu.data[qu.front].i; //
j = qu.data[qu.front].j;
if(i==xe && j==ye) //如果找到出口,就输出路径
{
find = 1;
print(qu,qu.front);
return true;
}
for(di=0;di<4;di++) //循环扫描每个方块的方位,把每个可走的方块插入队列之中
{
switch(di)
{
case 0: i = qu.data[qu.front].i-1;
j = qu.data[qu.front].j;
break;
case 1: i = qu.data[qu.front].i;
j = qu.data[qu.front].j+1;
break;
case 2: i = qu.data[qu.front].i+1;
j = qu.data[qu.front].j;
break;
case 3: i = qu.data[qu.front].i;
j = qu.data[qu.front].j-1;
break;
}
if(mg[i][j] == 0)
{
qu.rear++; //将该相邻方块插入到队列中
qu.data[qu.rear].i = i;
qu.data[qu.rear].j = j;
qu.data[qu.rear].pre=qu.front; //指向路径中上一个方块的下标
mg[i][j] = -1; //将其赋值为-1,以避免回过来重复搜索
}
}
}
return false; //为找到一条路径时返回 false
}


int main()
{
if(!mgpath(1,1,8,8))
cout<<"该迷宫问题没有解决!"<return 0;
}


相关文档
最新文档