算法学习019 BFS实现迷踪步 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析

news2024/9/20 10:42:55

C++BFS实现迷踪步

一、题目要求

1、编程实现

        有一个 n 行 m 列的方格迷宫,用 0 表示可以通过,用 1 表示不可以通过,每一步可以向上、下、左、右任意方向移动一格,请计算从左上角(1,1)位置移动到右下角(n,m)位置,最少移动多少步?

2、输入输出

输入描述:第一行输入矩阵大小n和m(3<=n<=m<=40)

                  接下来n行n列的数字(0和1组成)

输出描述:只有一行,一个整数,即从左上角到右下角最少移动多少步

输入样例:

6 8

0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0

输出样例:

12

二、算法分析

  1. 从给定题目的初步分析可以看出,本题要实现的是最短路径问题
  2. 实现矩阵的最短路径有多种方法,常见的可以使用深搜DFS和广搜BFS
  3. 今天我们给小朋友们用BFS进行实现,顺便学一下BFS是如何进行搜索的
  4. 首先小朋友们要了解什么是BFS,BFS是一种图遍历算法,用于在图数据结构中按层次展开图的节点,并逐个按层次访问节点。起始点作为第一层,与其直接相连的节点作为第二层,依次类推。
  5. 在我们这里就是按四个方向遍历整个矩阵;广度优先搜索使用队列数据结构来实现
  6. 实现过程:算法从起始节点开始,将起始节点入队,并标记为已访问。然后从队列中取出一个节点,访问该节点,并将其未访问的邻居节点加入队列。然后再从队列中取出一个节点,访问该节点,并将其未访问的邻居节点加入队列。以此类推,直到队列中没有节点为止,然后输出步数即可;因为在整个探索过程中,所有路径都是同时逐层从近到远探索,所以首先到达终点的路径一定最短。
  7. 所以我们在使用BFS进行算法实现之前呢,小朋友们需要先了解什么是队列,以及队列的性质
  8. 队列的原理及使用,小朋友们可以点击数据结构:队列详解 c++信息学奥赛基础知识讲解这这篇博客进行系统的学习,然后再回来尝试做一下这道题

三、程序编写

#include<bits/stdc++.h>
using namespace std;
int grid[101][101],visited[101][101];//gird存放矩阵数值,visited标记是否访问过
int n,m;//n和m为矩阵行列,mindis为最短距离
int f4[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//四个方向搜索
struct node //每个单元格作为一个节点
{
	int x;
	int y;
	int dis;
};
int BFS(int,int,int);//坐标及最短路径
int main()
{
	//输入矩阵
	cin >> n >> m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin >> grid[i][j];
	//计算最短路径
	cout <<	BFS(1,1,0);
}
int BFS(int x,int y,int z)
{
	visited[x][y] = 1;//起始点标记访问
	queue <node> q;	//声明一个队列
	node start,next;//声明队列的起点和下一个点
	//设置起始节点属性
	start.x = x;
	start.y = y;
	start.dis = z;
	q.push(start);//入队
	while(!q.empty())//队不为空
	{
		start = q.front();//获取队首元素
		q.pop();//出队
		if(start.x == n && start.y == m)//如果当前节点到到最后一个点,返回长度
			return start.dis;
		for(int i=0;i<=3;i++)//四个方向搜索
		{
			//获取下一个节点的属性
			next.x = start.x + f4[i][0];
			next.y = start.y + f4[i][1];
			next.dis = start.dis + 1;
			//下一个节点有路径到达且未访问过
			if(grid[next.x][next.y] == 0 && !visited[next.x][next.y])
			{
				visited[next.x][next.y] = 1;//访问
				q.push(next);//入队
			}
		}
	}
	return -1;
}

 本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102

四、运行结果

6 8

0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0

12

五、考点分析

难度级别:难,这题相对而言在于题目分析和算法的实现,具体主要考查如下:

  1. 分析题目,找到解题思路
  2. 充分掌握结构体和数组的使用
  3. 掌握队列的实现原理及相应的应用
  4. 学会广度优先算法原理并掌握相关用法
  5. 学会输入流对象cin的使用,从键盘读入相应的数据
  6. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  7. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  8. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  9. 充分掌握变量定义和使用、分支语句、循环语句和广度优先算法的应用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

六、推荐资料

  • 所有考级比赛学习相关资料合集【推荐收藏】

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

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

相关文章

算法的学习笔记—序列化二叉树(牛客JZ37)

&#x1f600;前言 二叉树是数据结构中的一个重要概念&#xff0c;它在各种算法和应用中广泛使用。然而&#xff0c;当我们需要将二叉树保存到磁盘或在网络中传输时&#xff0c;需要将其转化为一种可存储和传输的格式——这就是序列化的作用。反之&#xff0c;反序列化则是将这…

一款好用且免费的PDF编辑软件:PDFelement

PDFelement是一款多功能的PDF编辑器&#xff0c;可以阅读、编辑、扫描、注释、转换、签名、合并、加密和打印PDF文档。 软件截图&#xff1a; 该版本已授权&#xff0c;可以使用全部功能。 使用说明&#xff1a; 1、将压缩文件解压到某固定位置&#xff0c;不要随意移动&…

视频质量诊断服务 视频质量诊断工具 图像/视频质量分析服务及工具 深度学习视频质量分析系统

文章目录 概要Mongoose介绍算法单机版测试工具算法服务的使用方法小结 概要 根据客户的需求&#xff0c;基于Mongoose平台搭建了视频质量服务系统&#xff0c;该系统主要的功能包含生成base64图像数据、接收post的数据参数推送、视频质量算法分析以及处理结果的推送功能&#x…

【论文阅读】NGD-SLAM: Towards Real-Time SLAM for Dynamic Environments without GPU

arxiv上一篇很新的视觉SLAM论文&#xff0c;能够在不使用GPU的情况下进行语义分割的辅助运算。 一、跟踪流程 作为一个语义结合的视觉SLAM&#xff0c;其基本的思路和以前看过的DynaSLAM基本类似&#xff0c;都是依赖语义分割模型对场景中动态的特征点进行剔除&#xff0c;这…

【OSCP系列】OSCP靶机-Dawn1(原创)

OSCP系列靶机—Dawn1 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 这个靶机需要放在virtualBox 上&#xff0c;那么有关virtualBox 与 VMware 的kali网络通讯方法请访问&#xff1a;【基础知识】…

嵌入式软件开发的面试题

一、硬件电路 1.为什么电路一般使用220uf和104电容并联滤波 220μF电容通常被称为大电容,它具有较高的电容值,能够提供较好的低频滤波效果。它可以有效地滤除较低频率的噪声和干扰信号。这种电容在稳定电源电压、降低纹波和噪声方面非常有用。 另一方面,104电容是指电容值…

[matlab]MATLAB实现MLP多层感知机minist手写识别预测

【测试环境】 matlab2023a 【源码文件截图】 【实现部分代码】 mlp_test.m %% MLP 2-layer to test XOR clear; clc;Mode MNIST %Mode XORif (strcmp(Mode,MNIST))% Load the digits into workspace (MNIST Test, from% http://yann.lecun.com/exdb/mnist/)num_train 100…

el-date-picker 设置值输出格式

el-date-picker 设置值输出格式 现象 在请求后端的时候因为日期格式不对导致后端请求报错 看到时间默认的格式为&#xff1a;2024-08-13T16:00:00.000Z 这个时间如果需要转换成时间格式还是比较费劲的 解决方案 方式1-对字符串进行处理 formatDate(date) {// 格式化为 YY…

Java:常用API:Math类,System类

文章目录 Math常用方法代码 System类常用方法代码 RunTime类常用方法代码 黑马学习笔记 alt回车抛出异常 Math 常用方法 这是static方法&#xff0c;直接Math打点调方法 代码 package com.zhang.math;/*** Author: ggdpzhk* CreateTime: 2024-08-25* Math工具类的基本用法…

build.grade.kts 如何定义插件及插件扩展

定义插件和应用插件 在build.gradle.kts文件内 这里要注意的是&#xff0c;最后一行的Project扩展函数名必须要和上面apply方法里面create的参数一致&#xff0c;然后project扩展函数定义之前必须先apply<>()也就是先使用apply让plugin apply方法运行起来&#xff0c;才…

C++函数调用栈从何而来

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结 写在前面 程序员对函数调用栈是再熟悉不过了&#xff0c;无论是使用IDE…

printk的原理及使用

内核驱动调试的方法&#xff0c;先从我最常用的printk的使用方法开始讲起, printk在内核源码中用来记录日志信息的函数&#xff0c;方便我们调试追踪代码&#xff0c;只能在内核源码范围内使用。 本篇内核采用5.10版本。 很多内核开发者最喜欢的调试工具之一是printk(),printk(…

分享一个基于python新闻订阅与分享平台flask新闻发布系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【目标检测】AGMF-Net:遥感目标检测的无注意力全局多尺度融合网络

《Attention-Free Global Multiscale Fusion Network for Remote Sensing Object Detection》 遥感目标检测的无注意力全局多尺度融合网络 原文&#xff1a;https://ieeexplore.ieee.org/document/10371366 摘要 遥感目标检测&#xff08;RSOD&#xff09;在复杂背景和小目标…

设计模式篇(DesignPattern - 前置知识 七大原则)(持续更新调整)

目录 前置知识 一、什么是设计模式 二、设计模式的目的 七大原则 原则一&#xff1a;单一职责原则 一、案例一&#xff1a;交通工具问题 1. 问题分析 2. 解决思路 2.1 类级别单一职责 2.2 方法级别单一职责 3. 知识小结 二、案例二&#xff1a;待更新 原则二&…

本·阿弗莱克在与詹妮弗·洛佩兹离婚期间与孩子塞拉菲娜共度时光

在詹妮弗洛佩兹提出离婚申请期间&#xff0c;本阿弗莱克被发现与塞拉菲娜阿弗莱克一起在加州观看电影。 本阿弗莱克似乎将重心放在家庭时间上&#xff0c;最近有人拍到他带着孩子塞拉菲娜阿弗莱克在一起。此前&#xff0c;他的妻子詹妮弗洛佩兹 于 8 月 20 日星期二提出离婚。 …

小黄鸟九宫格切图丨教你如何将图片九宫格切图_照片分割成9张工具

图片九宫格怎么弄&#xff1f;怎么把1张图片切割称九宫图&#xff1f;如何将一张照片切成九宫格 微博九宫图怎么做&#xff1f;你还不知道电脑上如何做微博九宫格图片? 今天用小黄鸟九宫格切割工具&#xff0c;手把手教你,搞定九宫格切图 小黄九宫格切图丨小黄鸟教你如何九宫…

如何使用ssm实现基于web的药品管理系统+vue

TOC ssm175基于web的药品管理系统vue 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&…

五、Centos7-安装Jenkins--这篇废了

克隆了一个base的虚拟机&#xff0c;用来安装Jenkins 2023年11月&#xff0c;Jenkins不支持centos7了。我们只是学习用&#xff0c;先看看吧。 &#xff08; 另一个人用别的操作系统安装的jenkins&#xff0c;可以参考 版权声明&#xff1a;本文为博主原创文章&#xff0c;…

js第五天-对象

object let obj {uname: pink,age: 18,gender: w} 增 对象名.属性新值 这个和cpp不一样&#xff0c;可以在大括号外面新增属性 <script>let obj {uname: pink,age: 18,gender: w}obj.hobby footballconsole.log(obj);</script>删 delete delete obj.gender …