前言
使用c语言实现迷宫问题
参考数据结构教程的栈和队列的基本知识,来实现迷宫问题。
(c语言)用队列来实现迷宫问题
- 队列是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,另一端进行删除操作。
- 在迷宫问题中,使用队列来搜索可行路径,其实是用广度优先遍历(BFS)的算法来实现的。
- BFS就是从(1,1)开始将每一个可行的方块进行进队。最后得到路径最短的一条路线。
总结
下面就是用c语言在vs上编译的。
#include<stdio.h>
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}
};
typedef struct {
int i, j;
int pre;
}box;
typedef struct {
box a[100];
int rear, front;
}Queue;
bool mapQueque(int xi,int yj,int ei,int ej) {
int i, j, k;
Queue st;
st.front = st.rear = -1; //初始化
st.rear++; //进队
st.a[st.rear].i = xi; st.a[st.rear].j = yj;
st.a[st.rear].pre = st.front;
mg[xi][yj] = -1;
while (st.front != st.rear) { //队不为空
st.front++;
i=st.a[st.front].i; j = st.a[st.front].j;
if (i == ei && j == ej) {
//输入队列
/*for (int m = 0;m < 41;m++) {
printf("%d %d %d %d\n", m, st.a[m].i, st.a[m].j, st.a[m].pre);
}*/
int find = st.front, next, ns = 0;
printf("\n");
do { //反向找到最短路径,将该路径上的方块的pre成员设置成-1
next = find;
find = st.a[find].pre;
st.a[next].pre = -1;
} while (find != 0);
printf("一条迷宫路径如下:\n");
find = 0;
while (k < 100) { //正向搜索st.a数组里面的-1的方块,即构成最短路径
if (st.a[k].pre == -1)
{
ns++;
printf("\t(%d,%d)", st.a[k].i, st.a[k].j);
if (ns % 5 == 0)printf("\n"); //每5个换一次行
}
k++;
}
return true;
}
for (k = 0;k < 4;k++) {
switch (k)
{
case 0:i = st.a[st.front].i - 1;j = st.a[st.front].j;break; //上 //记住st.front的作用是先把一个方块所有的可行方块走完
case 1:i = st.a[st.front].i;j = st.a[st.front].j+1;break; //右
case 2:i = st.a[st.front].i + 1;j = st.a[st.front].j;break; //下
case 3:i = st.a[st.front].i;j = st.a[st.front].j-1;break; //左
}
if (mg[i][j] == 0) {
st.rear++;
st.a[st.rear].i = i; //可行方块存入队列里面 //即使出队,不代表把数据清除了
st.a[st.rear].j = j;
st.a[st.rear].pre = st.front;
mg[i][j] = -1; //表示这个方块已经走过,避免走重复的方块
}
}
}
return false;
}
int main() {
if (!mapQueque(1, 1, 8, 8))
printf("迷宫出问题\n");
return 0;
}