【问题描述】
以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】
实现队列求解迷宫从入口到出口的最短通路。
【测试数据】
迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
代码:
这里写代码片
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{
int x;//记录横坐标
int y;//记录纵坐标
int place;//用来记录上(结点)的位子
}NODE;//队列(结点)的数据类型
typedef struct
{
NODE data[MAX];//队列
int head;//对头
int end;//对尾
}DATA;
DATA *Create()//初始化队
{
DATA *p;
p = (DATA *)malloc(sizeof(DATA));//给p指针分个空间
if (p == NULL)
{
printf("error");
}
else
{
p->head = -1;//初始化头指针为-1
p->end = -1;//初始化尾指针为-1
}
return p;
}
int Verdictqueue(DATA *p)//判断队是否为空
{
if (p->end == MAX)
return 0;
else
return 1;
}
void Iputqueue(DATA *p, NODE s)//进栈函数
{
if (Verdictqueue(p))
{
p->data[++(p->end)] = s;//将元素s入栈(尾指针先加,因为首次是从-1开始的)
}
}
int main()
{
DATA *p;
NODE H, E, S;//H,E记录头尾坐标的变量的,S临时记录的变量
int i, j, x;//全是循环或者 临时记录的变量
int M[10][10] = {
{ 1,0,1,1,1,1,1,1,1,1 },//1
{ 1,0,0,1,0,0,0,1,0,1 },//2
{ 1,0,0,1,0,0,0,1,0,1 },//3
{ 1,0,0,0,0,1,1,0,0,1 },//4
{ 1,0,0,1,1,0,0,0,0,1 },//5
{ 1,0,0,0,1,0,0,0,0,1 },//6
{ 1,0,1,0,0,0,1,1,0,1 },//7
{ 1,0,1,1,1,0,1,1,0,1 },//8
{ 1,1,0,0,0,0,0,0,0,0 },//9
{ 1,1,1,1,1,1,1,1,1,1 }//10
};
p = Create();//调用函数 初始化队
H.x = 0; H.y = 1; H.place = 0;//起始坐标 和起始位置(H.place=0)打包在变量H中
E.x = 8; E.y = 9;//同理尾位置打包在E变量
Iputqueue(p, H);//将起始位置入队
M[H.x][H.y] = 2;//标记走过
while (p->head != p->end)//头指针没追上尾指针 表示有路,追上了退出 无路
{
p->head++;//每次头指针后移一位
for (i = 1; i <= 4; i++)//四个方向的循环
{/*将头指针里的数据拿出来作为 参考点 遍历其周围四个方向*/
S.x = p->data[p->head].x;
S.y = p->data[p->head].y;
S.place = p->head;//将参考点坐标 记下 它周围有满足条件的坐标时 一起入队(方便找到出口时可以根据线索返回)
switch (i)
{
case 1: {//上方向
if (M[S.x - 1][S.y] == 0)
{
S.x = S.x - 1; S.y = S.y;
Iputqueue(p, S);
M[S.x][S.y] = 2;
}
}; break;
case 2: {//右方向
if (M[S.x][S.y + 1] == 0)
{
S.x = S.x; S.y = S.y + 1;
Iputqueue(p, S);
M[S.x][S.y] = 2;
}
}; break;
case 3: {//下方向
if (M[S.x + 1][S.y] == 0)
{
S.x = S.x + 1; S.y = S.y;
Iputqueue(p, S);
M[S.x][S.y] = 2;
}
}; break;
case 4: {//左方向
if (M[S.x][S.y - 1] == 0)
{
S.x = S.x - 1; S.y = S.y;
Iputqueue(p, S);
M[S.x][S.y] = 2;
}
}; break;
}
}
if (p->data[p->head].x == E.x&&p->data[p->head].y == E.y)//找到出口 退出循环
break;
}
/*for (j = 0; j<10; j++)
{
for (i = 0; i<10; i++)
printf("%d,", M[j][i]);
printf("\n");
}*///打印迷宫
x = p->head;//结束时的坐标的下标
while (x>0)
{
printf("(%d,%d)\n", p->data[x].x, p->data[x].y);
x = p->data[x].place;//上一个(结点)的下标是本(结点)的place存的值
}
return 0;
}