走迷宫(详细分析)

目录

一、课题描述

输入样例:

输出样例:

二、需求分析

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

输出的形式:

程序所能达到的功能:

三、概要设计

四、流程图

五 、代码+详细注释

六、测试数据和结果


一、课题描述

以一个 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:

测试结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段学生组(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段学生组&#xff08;样卷&#xff09; 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段样题&#xff0c;内容包括&#xff1a;网络安全渗透、理论技能与职业素养。 本次比赛时间为180分钟。 介绍 GeekSe…

上海亚商投顾:沪指窄幅震荡 多只高位股午后跳水

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指冲高回落。锂电池板块集体反弹&#xff0c;西藏矿业、吉翔股份、永兴材…

01-Redis核心数据结构与高性能原理

一、Redis的单线程和高性能 1. Redis是单线程吗&#xff1f; Redis的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff08;说白了也就是执行命令的时候是由一个线程来完成的&#xff09;&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。…

基于epoll实现Reactor服务器

了解epoll底层逻辑 在我们调用epoll_create的时候会创建出epoll模型&#xff0c;这个模型也是利用文件描述类似文件系统的方式控制该结构。 在我们调用epoll_create的时候&#xff0c;就会在内核管理中创建一个epoll模型&#xff0c;并且建管理模块地址给file结构体&#xff…

python数据分析基础

前言 2023年10月以来&#xff0c;一位在商学院就读的可爱同学遇上了一门课——python数据分析&#xff0c;并遇到了许多问题&#xff0c;找上了我&#xff0c;就此&#xff0c;我也开始了学习之路&#xff0c;虽然很浅显&#xff0c;但这些东西对部门同学来说也是受用的&#…

TypeScript中的单件设计模式

基本概念 &#xff08;1&#xff09; 了解设计模式 设计模式通俗的讲&#xff0c;就是一种更好的编写代码方案&#xff0c;打个比喻&#xff1a;从上海到武汉&#xff0c;你可以选择做飞机&#xff0c;做轮船&#xff0c;开车&#xff0c;骑摩托车多种方式&#xff0c;把出行…

短视频购物系统源码:构建创新购物体验的技术深度解析

短视频购物系统作为电商领域的新宠&#xff0c;其背后的源码实现是其成功的关键。本文将深入探讨短视频购物系统的核心技术和源码设计&#xff0c;以揭示其如何构建创新购物体验的技术奥秘。 1. 技术架构与框架选择 短视频购物系统的源码首先考虑的是其技术架构。常见的选择…

ExoPlayer架构详解与源码分析(10)——H264Reader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

AI大模型:启动参数总结整理

虽然通过调整启动大模型的参数&#xff0c;对生成效果的提升是有限的&#xff0c;但适当的调整&#xff0c;还是能满足一些常用的场景的~ 一. 【max_length】 令牌生成最大数 用于控制生成文本的最大长度&#xff0c;默认为 20。它的值对应于输入提示的长度加上max_new_token…

10_企业架构NOSQL数据库之MongoDB

企业架构NOSQL数据库之MongoDB 学习目标和内容 1、能够简单描述MongoDB的使用特点 2、能够安装配置启动MongoDB 3、能够使用命令行客户端简单操作MongoDB 4、能够实现基本的数据操作 5、能够实现MongoDB基本安全设置 6、能够操作安装php的MongoDB扩展 一、背景描述及其方案设计…

【AI】以大厂PaaS为例,看人工智能技术方案服务能力的方向(1/2)

目录 一、深度学习能力 二、计算框架 2.1 语音 2.2 OCR 2.3 人脸/体识别 2.4 图像审核 2.5 图像识别 2.6 视频 2.7 自然语言理解 2.8 知识图谱 今天以百度智能云为例&#xff0c;梳理下人工智能技术方案服务能力&#xff0c;主要有哪些方向的应用和拓展。 纯属学习&…

JDK 9 模块化系统 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

博文目录 文章目录 Module System原因JDK 模块化模块描述文件关键字 启用模块化测试结论 Multi-Release jar (MRJAR)原因原理结论用 IDEA 创建多版本兼容 Jar项目结构pom.xml测试 Module System 原因 Java 9引入了模块化系统的主要原因是为了解决Java平台面临的复杂性和可维…

OpenCV图像相似性比对算法

背景 在做图像处理或者计算机视觉相关的项目的时候&#xff0c;很多时候需要我们对当前获得的图像和上一次的图像做相似性比对&#xff0c;从而找出当前图像针对上一次的图像的差异性和变化点&#xff0c;这需要用到OpenCV中的一些图像相似性和差异性的比对算法&#xff0c;在O…

C练习题13

单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.结构化程序由三种基本结构组成、三种基本结构组成的算法是() A.可以完成任何复杂的任务 B. 只能完成部分复杂的任务 C. 只能完…

打破常规思维:Scrapy处理豆瓣视频下载的方式

概述 Scrapy是一个强大的Python爬虫框架&#xff0c;它可以帮助我们快速地开发和部署各种类型的爬虫项目。Scrapy提供了许多方便的功能&#xff0c;例如请求调度、数据提取、数据存储、中间件、管道、信号等&#xff0c;让我们可以专注于业务逻辑&#xff0c;而不用担心底层的…

TrustZone之物理地址空间

除了两个安全状态外&#xff0c;该体系结构还提供了两个物理地址空间&#xff1a;安全和非安全。 在非安全状态下&#xff0c;虚拟地址始终转换为非安全物理地址。这意味着在非安全状态下的软件只能看到非安全资源&#xff0c;但永远看不到安全资源。如图所示&#xff1a; 在安…

大数据Doris(三十三):Doris高级设置

文章目录 Doris高级设置 一、增大内存

准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制

在 CentOS 8 上配置 PostgreSQL 14 的主从复制&#xff0c;并设置 WAL 归档到特定路径 /home/postgres/archive 的步骤如下&#xff1a; 主服务器配置&#xff08;主机&#xff09; 配置 PostgreSQL&#xff1a; 编辑 postgresql.conf 文件&#xff1a; vim /data/postgres/p…

Java二阶知识点总结(一)Maven

一、Maven概念 Maven是一个项目管理工具&#xff0c;其主要作用有2点 依赖管理&#xff1a;管理项目依赖的各种jar包自动构建&#xff1a;项目构建的过程&#xff0c;从编译、测试、运行、打包到安装的过程可以一键执行 二、Maven工程的目录结构 src/main/java&#xff1a;…

H5ke13-1浏览器处理异常

window对应的error没有event对象 window对应的error他接收三个参数,msg,url,行号 return false return true 1就不会返回错误 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title>&…