走迷宫(详细分析)

news2024/11/29 0:53:26

目录

一、课题描述

输入样例:

输出样例:

二、需求分析

输入的形式和输入值的范围:

输出的形式:

程序所能达到的功能:

三、概要设计

四、流程图

五 、代码+详细注释

六、测试数据和结果


一、课题描述

以一个 m*n 的方阵表示迷宫,0 和 1 分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的最短通路,或得出没有通路的结论。

输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8

二、需求分析

本设计程序用C++ 编写,完成二维数组迷宫的生成,找到走出迷宫的最短路径,或者返回没有通路的结论。

  • 输入的形式和输入值的范围:

  • 输入格式:第一行包含两个整数 n 和 m。接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。数据范围:1≤n,m≤100。
  • 输出的形式:

  • 输出一个整数,表示从左上角移动至右下角的最少移动次数。

   程序所能达到的功能:

    1.找到一条从入口到出口的最短通路2.如果迷宫内没有通路,则返回没有通路的结论。

三、概要设计

1 )数据逻辑结构、存储结构分析:

(1 ) 数据逻辑结构:

在迷宫求解的问题中,我运用了队列这种线性结构来存储最新到达的地点,队头出队即表示该点走向下一个结点。

(2 )存贮结构分析:

在迷宫求解的问题中,我运用了队列这种顺序结构,队列在这个代码中的作用是实现广度优先搜索算法(BFS)。BFS是一种图遍历算法,用于在图或二维网格中寻找最短路径或解决某些问题。

2 )本程序包含2 个函数:

(1 )广度优先搜索算法函数bfs()

  1. 参数描述:

g[N][N]:存贮迷宫信息

d[N][N]:存贮各个点到起始点的路径长度

PII q[N*N],hh,tt:模拟队列,PII q[N*N]:存贮队列中的数据,hh:队头,tt:队尾

Dx:代表这个点在x轴的偏移量,dy:代表这个点在y轴的偏移量

  1. 功能描述

初始化队列:将起始点排入队列中,即{0,0}。

初始化d数组:将d数组初始化为-1,从而在bfs搜索时能判断出这个点是否被搜索过

初始化dx数组和dy数组:即存贮x和y上下左右移动时的偏移量

For循环判断:将这个点进行上下左右四次移动,如果它在我的二维数组迷宫里面(未超出范围)并且移动之后点的值等于0(能够通行)而且是第一次通过(最短路),我就将它入队,并且记录它距离下一个点的距离加1,然后就是一个循环过程,只要我的队里有元素,就说明还未找到最短路。

(2 )主函数main()

  1. 参数描述

M,n:代表m行n列的迷宫

Flag:判断迷宫中是否有通路

  1. 功能描述

初始化迷宫:输入m行n列的迷宫

判断返回值:将bfs得到的结果进行判断,如果我的迷宫出口距离起始点不是-1的话(已经被搜索到过),那我就返回最短路径,否则返回没有通路。

流程图

五 、代码+详细注释

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

typedef pair<int, int>PII;

const int N = 110;
//定义一些全局变量
//n,m n行m列
//g数组 存贮迷宫
//d数组 存贮点到起始点的距离
//q二元组 存贮队列元素点的数据
int n, m;
int g[N][N];
int d[N][N];
PII q[N * N];
 
//重点!bfs的实现
int bfs()
{
    //队头hh,队尾tt
	int hh = 0, tt = 0;
    //队头起始点{0,0}
	q[0] = { 0,0 };

    //memset函数,将d数组初始化为-1,主要是用于后面判断此点是否被用过
	memset(d, -1, sizeof d);
    //将起始点距离初始化为0
	d[0][0] = 0;

    //用数组dx和dy分别存贮x和y和偏移量
	int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
    //只要我的队列中有元素,就说明广度搜索没搜索完
	while (hh <= tt)
	{
        //将队头元素弹出赋值给t
        //auto t其实就等于pair<int,int> t(auto 就是让系统自己猜出t的变量类型,不需要我写出冗杂的代码)
		auto t = q[hh++];
        //将队头弹出的点进行上下左右四次偏移
		for (int i = 0; i < 4; i++)
		{
            //t.first即指pair这个二元组前一个元素,t.second即后一个元素
            //这一步就是得到移动后x,y的坐标
			int x = t.first + dx[i], y = t.second + dy[i];
            //判断移动后的点是否能入队
            //x >= 0 && x < n && y >= 0 && y < m首先这个点不能超出我的迷宫边界
            //g[x][y] == 0 其次这个点得是我能通行的(即在这个迷宫上这个点的值为0)
            //d[x][y] == -1 由于我上面有过的初始化,所以d[x][y] == -1时代表这个点第一次被搜索
            //下一次搜索到这个点我就不要了,就不是最短路径了
			if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
			{
                //用d数组记录点到起始点的距离
				d[x][y] = d[t.first][t.second] + 1;
                //最后将bfs搜索到的点入队,进行下一次搜索
				q[++tt] = { x,y };
			}
		}
	}
    //最后返回终点距离起始点的距离
	return d[n - 1][m - 1];
}

int main()
{
    
	cin >> n >> m;

    //输入我的迷宫
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> g[i][j];

    //用flag接收bfs函数返回的值
    int flag = bfs();
    //如果返回的值等于-1的话,说明我的bfs并没有搜索到最后的出口,即这条迷宫没有通路
    //反之则有通路,并且是最短通路
    if (flag!=-1) cout << flag << endl;
    else cout << "此迷宫中,没有道路能走出去" << endl;

	return 0;
}

、测试数据和结果

测试数据1

测试结果:

测试数据2:

测试结果:

测试数据3:

测试数据4:

测试结果:

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

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

相关文章

win10编译golang程序报病毒错误

错误为command-line-arguments: open C:\Users\ADMINI~1\AppData\Local\Temp\go-build435947867\b001\exe\a.out.exe: Operation did not complete successfully because the file contains a virus or potentially unwanted software. 解决办法&#xff0c;将Local/Temp目录添…

流量分析1--菜刀666

1&#xff1a;菜刀666&#xff1a; 题目描述 分析流量包&#xff0c;过滤http数据流 追踪TCP数据流 对比第5个流和第7个流发现&#xff0c;同样的目录下 多出了6666.jpg。猜测是由攻击者上传&#xff0c;直接在请求包里搜索FFD8--FFD9 保存为1.jpg 利用foremost工具对1.jpg进…

【Axure高保真原型】个性化自定义图片显示列表

今天和大家分享个性化自定义图片显示列表的原型模板&#xff0c;鼠标点击多选按钮&#xff0c;可以切换按钮选中或者取消选中&#xff0c;按钮选中时&#xff0c;对应图片会在列表中显示&#xff0c;按钮取消后&#xff0c;对应图片会自动隐藏。那这个模板是用中继器制作的&…

三数之和(LeetCode 15)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;暴力法方法二&#xff1a;排序双指针 5.实现示例参考文献 1.问题描述 给你一个整数数组 nums&#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时…

Qt开发学习笔记01

设置窗口背景图 在 .h 文件中添加引用和方法 #include <QPainter> #include <QPixmap> void paintEvent(QPaintEvent *);.cpp 文件中实现 paintEvent void sur_dev::paintEvent(QPaintEvent *ev) {QPainter painter(this);QPixmap pix;pix.load(":/image/bj01…

金融行业文件摆渡,如何兼顾安全和效率?

金融行业是数据密集型产业&#xff0c;每时每刻都会产生海量的数据&#xff0c;业务开展时&#xff0c;数据在金融机构内部和内外部快速流转&#xff0c;进入生产的各个环节。 为了保障基础的数据安全和网络安全&#xff0c;金融机构采用网络隔离的方式来隔绝外部网络的有害攻击…

vue v-for获取子组件$ref总是拿到最后一个元素

页面循环列表&#xff0c;把子组件放在循环里面&#xff0c;此处获取this.$refs返回的应该是个数组&#xff0c;但是不知道为什么&#xff0c;一直返回的是循环的最后一个的子组件实列&#xff0c;官网上已经说明v-for返回的就是数组&#xff0c;所以一直很困惑 代码如下&#…

02 CSS基础入门

文章目录 一、CSS介绍1. 简介2. 相关网站3. HTML引入方式 二、选择器1. 标签选择器2. 类选择器3. ID选择器4. 群组选择器 四、样式1. 字体样式2. 文本样式3. 边框样式4. 表格样式 五、模型和布局1. 盒子模型2. 网页布局 一、CSS介绍 1. 简介 CSS主要用于控制网页的外观&#…

编程实战:类C语法的编译型脚本解释器(十)编译表达式

系列入口&#xff1a;编程实战&#xff1a;类C语法的编译型脚本解释器&#xff08;九&#xff09;编译语句 本文介绍表达式的编译。 一、代码概览 表达式的编译就是不断获取下一个标识符&#xff0c;直到遇到不属于表达式的东西。 完整代码如下&#xff1a; Expression* GetExp…

使用vue UI安装路由插件

1.使用vue创建项目 vue create vue-appvue ui 2.使用vue ui界面创建管理项目 终端页面输入&#xff1a;vue ui 创建项目 安装完成。可以直接在ui界面运行&#xff0c;也可以在编辑器中使用命令运行 安装路由&#xff0c;安装状态 选择插件 - 添加vue-router、添加vuex 安装…

面试常问的dubbo的spi机制到底是什么?(下)

前文回顾 前一篇文章主要是讲了什么是spi机制&#xff0c;spi机制在java、spring中的不同实现的分析&#xff0c;同时也剖析了一下dubbo spi机制的实现ExtensionLoader的实现中关于实现类加载以及实现类分类的源码。 一、实现类对象构造 看实现类对象构造过程之前&#xff0c;先…

8051的存储结构组成--程序存储空间、数据存储卡空间、特殊功能寄存器、位地址空间

AT89S51的存储结构 本文主要涉及8051单片机的存储结构&#xff0c;它的存储结构主要包括四部分&#xff0c;分别是出程序存储空间、数据存储卡空间、特殊功能寄存器、位地址空间四部分&#xff0c;下面将会展开描述。 文章目录 AT89S51的存储结构一、 程序存储空间二、 数据存储…

总结|哪些平台有大模型知识库的Web API服务

截止2023/12/6 笔者个人的调研&#xff0c;有三家有大模型知识库的web api服务&#xff1a; 平台类型文档数量文档上传并解析的结构api情况返回页码文心一言插件版多文档有问答api&#xff0c;文档上传是通过网页进行上传有&#xff0c;而且是具体的chunk id&#xff0c;需要设…

CentOS服务器网页版Rstudio-server及R包批量安装最佳实践

CentOS服务器安装网页版Rstudio-server及R包批量安装 以下为CentOS 7/8的Rstudio-server安装、配置和R包安装操作 1. 软件包安装 Centos 7安装 # 下载安装包&#xff0c;大小115.14 MB wget -c https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-…

【工厂方法】设计模式项目实践

前言 以采集数据处理逻辑为例&#xff0c;数据采集分为不同种类如&#xff1a;MQTT、MODBUS、HTTP等&#xff0c;不同的采集数据有不同的解析处理逻辑。但总体解析处理步骤是固定的。可以使用工厂方法设计模式简化代码&#xff0c;让代码变得更加优雅。 代码实践 抽象类 总体…

每天五分钟计算机视觉:通过残差块搭建卷积残差神经网络Resnet

本文重点 随着深度神经网络的层数的增加,神经网络会变得越来越难以训练,之所以这样就是因为存在梯度消失和梯度爆炸问题。本节课程我们将学习跳跃连接方式,它可以从某一网络层获取激活a,然后迅速反馈给另外一层,甚至是神经网络的更深层,从而解决梯度消失的问题。 传统的…

SMART PLC求余指令

SMART PLC求余功能块在伪随机数发生器上的应用请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/123793176https://rxxw-control.blog.csdn.net/article/details/123793176待续....

Qt之QGraphicsView —— 笔记1.2:将QGraphicsView放置主窗口上,绘制简单图元(附完整源码)

效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…

Nginx配置反向代理与负载均衡

Nginx配置反向代理与负载均衡 一、代理服务1.正向代理2.反向代理 二、实战场景-反向代理1.修改nginx配置 -> nginx.conf文件2.修改前端路径 三、实战场景-负载均衡1.热备2.轮询3.加权轮询4.ip_hash ​ Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器&#xff0c;…