嵌入式全栈开发学习笔记---数据结构(广度优先算法)

news2024/11/14 13:49:26

目录

过程分析

代码实现

queue_maze.c


上节我们讲完了队列,本节开始学习广度优先算法!

之前我们用深度优先算法找出从迷宫出来的所有路径,本次我们要用广度优先算法找出最短路径。

过程分析

广度优先算法也叫广度优先搜索。

这种算法就相当于是人有分身术,在起点的位置,人可以往右边那条路径走,分身可以往下面那条路径走,每人一步,在移动的过程中如果再次遇到分叉口,就可以再次分身,谁先到达终点,哪个路径就是最短路径。

显然我们需要一个东西来记录路径,这个东西就是循环队列。

然后我们就分析这个起点接下来是往右走,还是往下走,这时我们需要让这个点出队(每一个点出队就让队头指针往后移一个)

每走一个点就让它进队,遇到岔道口就让它出队,分析它该往哪里走。

分析它下一步的方向该往哪里走,我们也和上次一样规定四个方向,0是向上,1是向右,2是向下,3是向左。

比如我们现在是在起点,向上不能走,向左也不能走,向右可以,我们就把向右的这个点入队,进队操作的是队头(即把点放在此时队头所指向的位置)

进队结束后应该把队尾往后移一个

回来再看,在起点的位置向下也能走,所以把向下走的这个点进队

到这里,起点的这个已经分析完了,但是还必须得让它保留在这个数组里面,即还在这块内存里面,因为打印路径的路径的时候要用到。

这个点分析完之后,我们继续分析(0,1)这个点,所以让这个点出队(让队头指针向后移一个)

这个点只能向右走,于是把能走的这个点(0,2)进队

接下来分析(1,0)的这个点,让它出队,它只能往下走,于是让(2,0)这个点进队

接下来分析(0,2)这个点,让它出队,它可以往下走,也可以往右走

......

分析到这里我们已经知道这其实是多条路径同时进行的,谁先到达终点,说明谁走过的路径就是多短路径。

这个过程什么时候结束呢?

当最后出队的点(即要分析的点)是终点的时候这个过程就结束了。

当我们知道谁走过的那条路是最短路径的时候,怎么打印出来呢?

比如我们知道走过(2,0)这个点对应的是最短路径,我们就可以顺着记录下来的下标找到它前面点,依次倒推,就能得到一条完整的路径

下面开始写代码

代码实现

queue_maze.c

#include <stdio.h>


//定义一个点
typedef struct Box
{
	int x;//点的行坐标
	int y;//点的列坐标
	int pre;//前面那个点在数组(队列)中的下标
}Box;

typedef struct Queue
{
	Box data[1024];//点
	int front;//队头
	int rear;//队尾

}Queue;

//定义一个二维数组
int map[6][6] = {
    {0, 0, 0, 0, 0, 0},
    {0, 1, 0, 1, 1, 0},
	{0, 1, 0, 0, 1, 0},
	{0, 1, 1, 0, 1, 0},
	{0, 1, 1, 0, 0, 1},
	{0, 0, 0, 0, 0, 0}
};

//初始化队列函数
void InitQueue(Queue*q)
{
	q->front=q->rear=0;
}

//进队函数
void push(Queue *q,Box b)
{
	//把元素(点)放在队尾这个地方,同时队尾向后移动一个
	q->data[q->rear++]=b;
}

//出队函数
void Pop(Queue*q, Box*b)
{
	//先把点记录下来,再出队(front++)
	*b=q->data[q->front++];
}

//判断空队
int EmptyQueue(Queue *q)
{
	//队头和队尾重合就是空队
	return (q->front==q->rear) ? 1:0;
}

//打印路径函数
void ShowPath(Queue *q,int end)
{
	//顺着我们记下来的pre先从后往前,把走过的标为-1,然后再从前往后走打印出来
	int i,tmp;
	for(i=end-1;i>=0;)
	{
		tmp=q->data[i].pre;//把pre存下来
		q->data[i].pre=-1;//然后再改成-1
		i=tmp;//tmp正好是上一个点的下标
	}

	for(i=0;i<end;i++)
	{
		if(q->data[i].pre==-1)
		{
			printf("[%d %d]-->",q->data[i].x,q->data[i].y);
		}
	}
	printf("\n");
}

//走迷宫函数
int Walk(Queue*q,int x1,int y1,int x2,int y2)
{
	//创建起点和下一个点
	Box now,next;
	//初始化起点
	now.x=x1;
	now.y=y1;
	now.pre=-1;
	//起点进队
	push(q,now);//把队列和点传过去
	//标记走过的点
	map[now.x][now.y]=-1;

	while(EmptyQueue(q)!=1)//只要队列不为空就继续循环
	{
		//分析某个点,让某个点出队
		Pop(q,&now);

		if(now.x==x2 && now.y==y2)//最后出队的是终点
		{
			//打印路径
			ShowPath(q,q->front);
			return 1;//结束程序
		}
		
		//如果不是终点就需要分析它接下来可以走的方向
		int dir;//0向上,1向右,2向下,3向右
		for(dir=0;dir<4;dir++)
		{
			switch(dir)
			{
				case 0:
					next.x=now.x-1;
					next.y=now.y;
					break;
				case 1:
					next.x=now.x;
					next.y=now.y+1;
					break;
				case 2:
					next.x=now.x+1;
					next.y=now.y;
					break;
				case 3:
					next.x=now.x;
					next.y=now.y-1;
					break;
			}
			//要知道某个方向能不能走需要先把它的坐标求出来有没有超范围和条件
			if(next.x>=0 && next.x<=5 && next.y>=0 && next.y<=5 && map[next.x][next.y]==0)
			{
				//把“从哪里过来的点”记录下来
				next.pre=q->front-1;
				//如果点可以走就可以让它进队
				push(q,next);
				//标记走过了
				map[next.x][next.y]=-1;
			}
		}
	}

	return 0;
}




int main()
{
	//创建队列
	Queue queue;
	//初始化队列
	InitQueue(&queue);
	//走迷宫
	if(Walk(&queue,0,0,5,5)==0)//队列 起点坐标 终点坐标
	{
		printf("路径不存在\n");
	}
	return 0;
}

运行结果

这条路径先到达终点

下节开始学习二叉树!

QQ交流群:963138186

本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…

vscode用快捷键一键生成vue模板

项目中有些代码模块是固定的&#xff0c;如下面的代码所示&#xff0c;为了不重复写这些相同的代码&#xff0c;我们可以使用快键键一键生成模板。 流程&#xff1a; 中文&#xff1a;首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件&#xff08;没有vue.j…

如意AI健康管理开放域自然对话算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全&#xff1a;通过意图识别和实体抽取技术&#xff0c;确保生成的内容不涉及违法或不当信息。 信息源安全&#xff1a;数据采集环节采用安全措施&#xff0c;保护数据不被非法访问。 2. 算法监测 信息安全监测&#xff1a;实施实…

国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板&#xff08;米尔基于芯驰D9360国产开发板&#xff09;的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库&#xff0c;即 TinyML 推理库&a…

重头开始嵌入式第十六天(结构体,共用体)

目录 结构体 结构体定义 结构体初始化 结构体赋值 结构体调用 结构体大小 在 C 语言中&#xff0c;结构体内存对齐规则主要遵循以下原则&#xff1a; 共用体 共用体定义 共同体赋值&#xff0c;初始化 共用体大小 结构体与共用体的区别 结构体 在 C 语言中&#xff0c;…

vuex properties of undefined (reading ‘getters‘)

前言&#xff1a; 最近打算用vue 写个音乐播放器&#xff0c;在搞 vuex 的时候遇到一个很神奇报错&#xff1b;vuex 姿势练了千百次了&#xff0c;刚开始的时候我一直以为是代码问题&#xff0c;反复检查了带了&#xff0c;依旧报错。 Error in mounted hook: "TypeError:…

PHP全方位多功能投票小程序系统源码

&#x1f31f;【全民参与&#xff0c;决策更精彩】全方位多功能投票小程序大揭秘&#xff01;&#x1f389; &#x1f680; 开篇引入&#xff1a;投票新风尚&#xff0c;尽在指尖 Hey小伙伴们&#xff0c;你是否厌倦了传统的投票方式&#xff0c;觉得它们既繁琐又不够灵活&am…

历代文学-技术生态-总体介绍

1. 历代文学简介 历代文学&#xff08;https://literature.sinhy.com/#/literature?__c1000&#xff0c;微信小程序可直接搜索“历代文学”&#xff09;是一个由两个人&#xff08;一个后端和一个前端&#xff09;开发的文学网站&#xff0c;是一个收录从古到今、以及古今中外…

C++之运算符重载系列深入学习:从入门到精通!

为什么需要对运算符进行重载 C预定义中的运算符的操作对象只局限于基本的内置数据类型&#xff0c;但是对于我们自定义的类型是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算&#xff0c;这个时候就需要我们对这么运算符进行重新定义&#xff0c;赋予其…

智能家居中高性能联网通信方案,乐鑫ESP32-S3/C3无线Wi-Fi蓝牙应用

随着科技的飞速发展&#xff0c;智能家居已经不再是科幻小说中的概念&#xff0c;而是走进了千家万户的现实生活。 智能家居是广泛的系统性产品概念&#xff0c;以住宅为载体&#xff0c;运用物联网、网络通信和人工智能等技术&#xff0c;接收信号并判断&#xff0c;提供更加…

美股全线反弹,市场情绪回暖

一、市场概况 昨夜美股三大股指全线收涨&#xff0c;市场情绪明显回暖。道琼斯工业平均指数上涨1.76%&#xff0c;纳斯达克综合指数上涨2.87%&#xff0c;标普500指数则上涨2.3%。美债市场方面&#xff0c;美国十年期国债收益率上涨1.141%&#xff0c;报3.99%&#xff0c;两年…

[ Python ]使用Charles对Python程序发出的Get与Post请求抓包-解决Python程序报错问题

目录 一、前言 二、Charles 三、抓取Python请求 3.1 正常运行 3.2 程序报错 3.2.1 报错信息 3.2.2 解决方法 3.3 取消警告信息 四、总结 一、前言 在Python开发中&#xff0c;网络请求是常见的操作之一。无论是使用内置的urllib库还是第三方库requests&#xff0c;都可…

Java小白入门到实战应用教程-Scanner类及IO流讲解

Java小白入门到实战应用教程-Scanner类及IO流讲解 Scanner类 我们前面写的很多例子都是程序独自执行的&#xff0c;但是我们做编程写代码的目的是要实现能人和代码去交互的。 现在我们就来了解一个知识点&#xff0c;去实现最简单的人和程序的交互。 在java中通过Scanner类…

MySQL第3讲--数据类型和表的修改和删除

文章目录 前言数据类型数值类型整数类型浮点数和定点数 字符串类型字符类型&#xff1a;文本类型&#xff1a;二进制数据类型 日期和时间类型实例分析 表的操作添加字段修改字段删除字段修改表名删除表 DDL总结DDL数据库操作DDL表操作 前言 上一节在MySQL第2讲–关系型数据库以…

kubernetes 管理平台 Pod管理多容器 与嵌入式脚本

资源清单文件 模板与帮助信息 管理资源对象 多容器 Pod 管理多容器 Pod 自定义任务 容器保护策略 宽限期策略 Pod调度策略

CUDA编程从零到壹

如今&#xff0c;当我们谈论深度学习时&#xff0c;为了提高性能&#xff0c;我们通常会将其实现与使用 GPU 联系起来。 GPU&#xff08;图形处理单元&#xff09;最初设计用于加速图像、2D 和 3D 图形的渲染。然而&#xff0c;由于它们能够执行许多并行操作&#xff0c;它们的…

linux 源码部署polardb-x 错误汇总

前言 在linux 源码部署polardb-x 遇到不少错误&#xff0c;特在此做个汇总。 问题列表 CN 启动报错 Failed to init new TCP 详细错误如下 Caused by: Failed to init new TCP. XClientPool to my_polarx#267b21d8127.0.0.1:33660 now 0 TCP(0 aging), 0 sessions(0 runni…

【汇总】测开高频面试题

加油 &#xff01;&#xff01;&#xff01; &#x1f525; 谈谈对测试的理解 我认为测试是发现并及时解决问题&#xff1a;包括功能、性能、用户体验❤️等方面的验证 … 通过提前定位并修复缺陷&#xff0c;可以减少未来维护成本、保障软件质量、提升用户满意度❤️ … 我了…

大麦/猫眼抢票-狠货

大部分购买方式已迁移至手机端&#xff0c;专注研究移动端 小白操作–仅供学习 注意在帐号按权重的第三方账号设置解绑淘宝&#xff0c;否则有可能在抢票时候出现滑块&#xff0c;影响抢票,抢票优先选择大麦 ⚠️核心内容参考&#xff1a; 据悉&#xff0c;在购票环节&…

23_windows 使用sqlmap、kali使用sqlmap,SQL注入、sqlmap自动注入

sqlmap介绍 安装sqlmap 安装python环境 链接&#xff1a;https://pan.baidu.com/s/16QhhYCppSvuUikhKiOHNgg?pwd9LJY 提取码&#xff1a;9LJY C:\Users\leyilea> python // 测试python能不能用 >>> exit() // 退出 测试sqlmap是否可用 kali中运行sqlmap&#xff…