2021-04-26

前言

使用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;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值