bfs之走地图(迷宫)

2023-05-16

题目:东东找妹纸。

东东手里有一张神奇的地图,通过地图可以找到妹子!地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。

输入输出要求及样例见下图:

 

思路:

这是一个需要求解最短路径的问题,考虑使用广度优先搜索配合队列,广度优先搜索是一层一层进行搜索的,一步能到达的点这个方法就不会让你走两步到达(因为在第一层搜索的时候已经把点加入队列了)。由于结果是要求整个路径而不是最小距离,因此在进行bfs时需要记录每一点的上一个位置。

流程如下:

首先将起点加入队列中;

开始循环依次处理队列中的每一个点,处理方法为找到该点相邻的且未被标记的点(用vis数组记录标记信息)加入队列,在处理相邻点的时候使用偏移量dx、dy,由于题目要求路径,因此在讲每个点加入队列的同时记录前一个点在road数组中;

直到终点被标记,整个广度优先搜索过程结束;

因为找到路径时是从终点向起点回溯的,因此找寻出来的路径正常来讲是反序的。这个正序输出的方法相当暴力,没有采取递归的方法。而是从终点开始,找到终点的前一个点a,然后再找点a的前一个点,循环该过程,直至回到起点。在此过程中,将点信息反序保存在了一位数组output中,然后再正序输出,就输出了寻找妹纸的路径。

 

代码:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int maze[5][5];//迷宫
int dis[5][5];//距离 
pair<int,int> road[5][5];//路径
bool vis[5][5];
pair<int,int> output[25];

queue<pair<int,int> >  q;

const int dx[4] = {0,0,-1,1};//上下左右
const int dy[4] = {1,-1,0,0};//上下左右

void bfs()
{
	memset(vis,false,sizeof vis);
	memset(dis, 63, sizeof dis);
	memset(output, 0, sizeof output);
	pair<int,int> p1(0,0);
	q.push(p1);
	vis[0][0] = true;
	dis[0][0] = 0; 
	road[0][0] = p1;
	while(!q.empty())
	{
		//bool is = false;
		pair<int,int> p = q.front();
		q.pop();
		for(int i=0 ;i<4 ;i++)
		{
			int x = p.first + dx[i];
			int y = p.second + dy[i];
			if(x>=0 && x<5 && y>=0 && y<5 && maze[x][y]==0 && vis[x][y]==false)
			{
				pair<int ,int> p2(x,y);
				q.push(p2);
				dis[x][y] = dis[p.first][p.second] + 1;
				vis[x][y] = true;
				pair<int ,int> p3(p.first,p.second);
				road[x][y] = p3;
				if(x==4 && y==5) break;	
			}
		}
	}
	
	int a =4 ,b = 4;
	int count = 24;
	while(a!=0 || b!=0)//把路径弄到数组output里 
	{
		int u = road[a][b].first;
		int v = road[a][b].second;
		pair<int ,int> p4(u,v);
		output[count--] = p4;
		a = u;
		b = v;
	}
	cout<<"(0, 0)"<<endl;
	for(int i=0 ;i<25 ;i++)
	{
		if(output[i].first==0 && output[i].second==0)
			continue;
		cout<<"("<<output[i].first<<", "<<output[i].second<<")"<<endl;
	}
	cout<<"(4, 4)"<<endl;	
}

int main()
{
	for(int i=0 ;i<5 ;i++)
		for(int j=0 ;j<5 ;j++)
			cin>>maze[i][j];
			
	bfs();
}

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bfs之走地图(迷宫) 的相关文章

  • bfs之走地图(迷宫)

    题目 xff1a 东东找妹纸 东东手里有一张神奇的地图 xff0c 通过地图可以找到妹子 xff01 地图显示 xff0c 0表示可以走 xff0c 1表示不可以走 xff0c 左上角是入口 xff0c 右下角是妹纸 xff0c 这两个位置
  • HDOJ 题目3848 CC On The Tree(BFS)

    CC On The Tree Time Limit 2000 1000 MS Java Others Memory Limit 125536 65536 K Java Others Total Submission s 1684 Accep
  • 计蒜客-蒜头君回家(bfs)

    蒜头君要回家 xff0c 但是他家的钥匙在他的朋友花椰妹手里 xff0c 他要先从花椰妹手里取得钥匙才能回到家 花椰妹告诉他 xff1a 你家的钥匙被我复制了很多个 xff0c 分别放在不同的地方 蒜头君希望能尽快回到家中 xff0c 他需
  • leetcode 1345. Jump Game IV | 1345. 跳跃游戏 IV(BFS)

    题目 https leetcode com problems jump game iv 题解 好久没做 hard 了 xff0c 今天时间多 xff0c 挑战一下 用 lqy 同学的话说 xff0c 这题叫做 苦难题 xff0c 哈哈哈 暴
  • 【leetcode】44. 通配符匹配(wildcard-matching)(BFS)[困难]

    链接 https leetcode cn com problems wildcard matching 耗时 解题 xff1a 4 5 h 题解 xff1a 36 min 题意 给定一个字符串 xff08 s xff09 和一个字符模式 x
  • BFS题单总结

    BFS题单汇总 此文章用来记录遇到的经典的从某个点到达某个边界或者指定点的BFS题目 xff0c 将持续更新 1926 迷宫中离入口最近的出口 span class token keyword class span span class t
  • c++:DFS与BFS详解

    DFS xff08 深度优先搜索 xff09 xff1a 从某个状态开始 xff0c 不断转移状态到无法转移为止 xff0c 然后退回到前一步 xff0c 继续转移到其他状态 xff0c 不断重复 xff0c 直至找到最终的解 总是从最开始
  • 拓扑排序(广度优先搜索实现)

    有向无环图可以用来表示各种事物的顺序 比如工作顺序 一些事情必须在另一些事情完成之后才能开始进行 那么 为了获得正确的工作顺序 一件事情开始之前 必须保证它的前置条件全部满足 就需要用到拓扑排序 拓扑排序其实就是在有向无环图中 只要存在边
  • 图论(四)宽度优先搜索BFS

    宽度优先搜索 BFS Breadth First Search 是一个针对图和树的遍历算法 发明于上世纪50年代末60年代初 最初用于解决迷宫最短路径和网络路由等问题 对于下面的树而言 BFS方法首先从根节点1开始 其搜索节点顺序是1 2
  • 判断二叉树是否为完全二叉树

    判断二叉树是否为完全二叉树 提示 本节仍然是重点说二叉树的DP递归套路 非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些 可以帮助你快速掌握树形DP的题目解题思想 就一个套路 1 判断二叉树是否为平衡二叉树 树形DP 树
  • hdu1253 胜利大逃亡(三维bfs索搜)

    http acm hdu edu cn showproblem php pid 1253 第一次做做三维的 思路跟二维的没有区别 这道题目第一次出现Memory Limit Exceeded 这种问题 找了很长时间才发现应该是先判断在存入
  • 【4月第二周学习记录】数据结构与算法王卓-第六章图-图的遍历(邻接矩阵与邻接表,DFS与BFS)

    1 图的遍历基本思路与方法 图的遍历的定义与visited数组 常用的遍历方法 深度优先搜索遍历 Depth First Search DFS 广度优先搜索遍历 Breadth First Search BFS 2 深度优先搜索遍历 Dep
  • LeetCode_433. 最小基因变化

    题目链接 力扣 这道题是一道经典的BFS题型 我觉得可能会踩坑导致不能一次AC的地方有两处 一是bankSize可能为0 那么我们开辟一个记录数组的时候会报错 二是题目所说的 起始基因序列 start 默认是有效的 但是它并不一定会出现在基
  • Oil Deposits(BFS)

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits GeoSurvComp works with one
  • 2020蓝桥杯模拟——长草

    1 题目描述 小明有一块空地 他将这块空地划分为 n 行 m 列的小块 每行和每列的长度都为 1 小明选了其中的一些小块空地 种上了草 其他小块仍然保持是空地 这些草长得很快 每个月 草都会向外长出一些 如果一个小块种了草 则它将向自己的上
  • LeetCode_BinaryTree_1129. Shortest Path with Alternating Colors 颜色交替的最短路径【BFS求最短路径】【java】【中等】

    一 题目描述 英文描述 You are given an integer n the number of nodes in a directed graph where the nodes are labeled from 0 to n 1
  • LeetCode0752-打开转盘锁

    LeetCode0752 打开转盘锁 题目 你有一个带有四个圆形拨轮的转盘锁 每个拨轮都有10个数字 0 1 2 3 4 5 6 7 8 9 每个拨轮可以自由旋转 例如把 9 变为 0 0 变为 9 每次旋转都只能旋转一个拨轮的一位数字 锁
  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • 方板围棋吃子换001

    1 描述 130给定一个二维的矩阵 包含 X 和 O 字母 O 找到所有被 X 围绕的区域 并将这些区域里所有的 O 用 X 填充 示例 X X X X X O O X X X O X X O X X 运行你的函数后 矩阵变为 X X X
  • 数据结构--树存储结构 & 深度优先遍历 & 广度优先遍历 通俗易懂

    树的概念 首先 树是一种常用的非线性数据结构 是以边 Edge 相连的节点 Node 的集合 每个节点存储对应的值 当存在子节点时与之相连 根节点 是树的首个节点 边 所有节点都由边相连 用于标识节点间的关系 叶子结点 树的末端节点 它们没

随机推荐

  • SpringBoot中的service报空指针异常

    SpringBoot中的service报空指针异常 异常排查 xff1a 1 检查Service是否加了 64 Service注解 2 Controller中的属性service是否加了 64 Autowired注解 3 检查所写的对外接口
  • 本地上运行正常,但是部署到了服务器却一直验证码错误(Nginx反向代理导致的session丢失问题)

    最近做一个课程项目 xff0c 在本地开发完后部署到服务器上 xff0c 一切都比较顺利 但是在登录用户的时候却一直显示验证码错误 xff01 xff01 xff01 排错过程 1 代码检查2 参数检查3 外层检查4 直接访问5 通过Ngi
  • 如何在Golang中使用MongoDB的事务

    如何在Golang中使用MongoDB的事务 一 Mongo中的事务1 Mongo新特性2 基于会话的事务3 事务相关命令 二 搭建Mongo副本集1 安装MongoDB2 环境变量配置3 创建副本集目录3 1 创建主节点相关目录3 2 创
  • Golang中AK/SK认证的实现

    Golang实现AK SK认证 一 AK SK概述1 什么是AKSK2 AK SK认证过程 二 AK SK认证例子1 设计ak sk的请求参数2 数据库中保存sk3 客户端生成签名4 服务端校验签名 一 AK SK概述 1 什么是AKSK
  • BC20 AT指令测试

    1 准备工作 1 1 单片机型号 1 2 软件准备 下载链接 xff1a https pan baidu com s 1uLPwV2OuvxP6X6eq Eplow 提取码 xff1a rc77 1 3 程序下载 在网盘资料中下载名为dem
  • 模拟Docker为容器建立bridge网络

    模拟Docker为容器建立bridge网络 1 安装docker2 创建Nginx容器3 手动为容器设置网络4 验证网络 在阅读本文之前 xff0c 请先了解一下linux的namespace机制 1 安装docker Centos下安装
  • Golang服务端对接Google Play结算系统订阅

    Google订阅 公司产品需要需对Google订阅 xff0c 查了很多资料和相关文档 xff0c 最终总结出以下内容 如果本文中存在任何不准确的地方 xff0c 请不吝指出 xff0c 我会尽快改正 Google相关文档 xff1a 销售
  • (八) OAuth 2.0 认证成功,认证失败,退出成功

    认证成功 监听AuthenticationSuccessEvent xff0c 注意在刷新令牌 xff0c 校验令牌 xff0c 登录密码校验成功都会发布这个事件 xff0c 所以我们需要在监听器里面做一些排查判断 successHandl
  • 单片机组合实验二——定时器,数码管显示

    题目 xff1a 两个数码管 xff0c K1 K2两个按键 xff0c 完成K1启动计数 xff0c K2暂停计数 xff0c 每一秒钟数码管增加1 xff0c 60秒钟后 xff0c 蜂鸣器响一声 xff0c 数码管回归0 xff0c
  • 串口控制蜂鸣器

    题目 xff1a 通过串口助手发送1 xff0c 蜂鸣器以400ms频率发声 xff1b 发送2 xff0c 以200ms频率发声 xff1b 发送3 xff0c 以100ms频率发声 xff1b 发送4 xff0c 蜂鸣器不发声 span
  • 51单片机——简易时钟

    代码 span class token macro property span class token directive keyword include span span class token string 34 reg51 h 34
  • 51单片机—按键控制点阵显示

    名称 xff1a 按键控制 8X8LED 点阵屏显 示图形 说明 xff1a 每次按下 K1 时 xff0c 会使 8X8LED 点阵屏循环显示不同图形 本例同时使用外部中断和定 时中断 span class token macro pro
  • 手把手入门stm32f4 (1)

    GPIO 1 一共有7组IO xff0c 每组有16个口 即一共有16 7 61 112个口 2 每个口基本上都可以触发中断 xff08 区别于51 xff0c 51只有P3 2 P3 2 xff09 3 共有8中输入输出模式 xff08
  • STM32F103 配置Systick

    Systick系统滴答时钟 Systick h ifndef SYSTICK H define SYSTICK H include 34 stm32f10x h 34 void SysTick Init void void Delay ms
  • 手把手入门STM32 ——步进电机操作

    Uln2003驱动五线四向布进电机 xff08 按一次按键步进电机约旋转60 xff09 Uln2003 h span class token macro property span class token directive keywor
  • java后端CRUD功能实现

    1 springboot框架建立 框架建立可参考以下博客 xff0c 需要把补充部分也完成 https blog csdn net daniaoxp article details 119811741 内容稍有不同 xff0c 还要做以下改
  • 基于comsol软件弯曲单模光纤模拟仿真

    在本节中 xff0c 主要基于实验室实际光纤单模圆柱光纤进行模拟 xff0c 与comsol案例库文件在分析过程和建模有些差异 xff1a 模拟主要通过以下三个步骤进行 xff1a 模型的几何构建 物理场的添加研究 结构处理分析来进行 下面
  • 为什么使用hdf5存取文件,速度却比使用csv存取文件的速度还慢?

    数据集大小 xff1a xff08 200000 9 22 43 200000 10 11 xff09 36 43 xff08 250000 9 22 43 250000 10 11 xff09 3 个数值 最初是用csv存这些数的 xff
  • 倒水问题(bfs)

    倒水问题 题目 xff1a 两个容量不同且互质的杯子相互倒水 xff08 相互倒水时必须将其中一个杯子倒水或者倒空 xff0c 不存在倒半杯的情况 xff0c 要不然谁也不能确定倒了多少升水不是 xff09 xff0c 直到倒出C升的水 题
  • bfs之走地图(迷宫)

    题目 xff1a 东东找妹纸 东东手里有一张神奇的地图 xff0c 通过地图可以找到妹子 xff01 地图显示 xff0c 0表示可以走 xff0c 1表示不可以走 xff0c 左上角是入口 xff0c 右下角是妹纸 xff0c 这两个位置