当前位置: 首页 > 编程日记 > 正文

BFS:走出迷宫并输出最小步数

目录

背景

描述

例子

思路

完整代码

收获总结

背景

描述

给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而“.”代表墙壁,S表示起点,T代表重点。移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右(x,y+1),(x,y-1),(x-1,y),(x+1,y)四个位置的平地,求从起点S到达终点T的最少步数。

例子

. . . . .
. * . * .
. * S * .
. * * * .
. . . T *

上面的例子中,起点S的坐标是(2,2),终点T的坐标是(4,3),最少步数为11。

思路

由于BFS是通过层次顺序来遍历,可以从起点开始记遍历的层数,到终点时遍历的层数即为步数。

完整代码

#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>using namespace std;const int maxn = 100;struct Node{int x,y;//坐标(x,y)int step = 0;//是层数也是步数 
}S,T,node;//分别是起点、终点、临时结点int n,m;//行和列
char maze[maxn][maxn];//存放迷宫的路况
bool inq[maxn][maxn] = {false};//是否已经入过BFS的队列 
int X[4] = {0,0,-1,1};//增量数组 
int Y[4] = {1,-1,0,0};//判断当前位置是否能够入队
bool judge(int x,int y){//越界,不行if(x<0||x>=n||y<0||y>=m)return false;//碰壁,也不行if(maze[x][y]=='*')return false;//已经入过了,不行if(inq[x][y])return false;return true; 
}//BFS函数的任务是返回到达终点所走步数,如果到达不了就返回-1
int BFS(){queue<Node> que;//定义队列que.push(S);//起点入队while(!que.empty()){Node top = que.front();//取出队首元素que.pop();//队首元素出队if(top.x == T.x&&top.y == T.y)return top.step;//抵达了终点,返回步数 for(int i=0;i<4;i++){int newX = top.x + X[i];int newY = top.y + Y[i];if(judge(newX,newY)){//判断是否能够入队 node.x = newX;node.y = newY;node.step = top.step+1;//因为node是top的下一层结点 que.push(node);//node入队inq[newX][newY] = true;//设置node已经入队 }}}return -1; 
} int main(){scanf("%d%d",&n,&m);getchar();//吸收换行符for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%c",&maze[i][j]);getchar();}}scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);printf("%d\n",BFS());return 0;
}

收获总结

1. 要知道把最少步数和BFS联系在一起,并在结点结构体里加层数(也是步数)step属性

2. BFS必备:队列,判断函数

3. 矩阵题必备:增量数组,判断函数

相关文章:

人工智能和机器学习领域有哪些有趣的开源项目

人工智能和机器学习领域有哪些有趣的开源项目&#xff1f;投递人 itwriter 发布于 2014-12-02 11:21 评论(0) 有20人阅读 原文链接 [收藏] 本文简要介绍了 10 款 Quora 上网友推荐的 人工智能和机器学习领域方面的开源项目。 GraphLab GraphLab 是一种新的面向机器学习…

复杂度归纳--小结

一、复杂度分析的4个概念1.最坏情况时间复杂度&#xff1a;代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度&#xff1a;代码在最坏情况下执行的时间复杂度。3.平均时间复杂度&#xff1a;用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度&#xff…

KDE社区:首个KDialogue正式开放

今天KDE社区与“People Behind KDE” 合作推出一个非常有意思的栏目&#xff0c;叫作KDialogue。 关于KDialogue&#xff0c;有点类似头脑风暴。简言之就是成员向社区发起关于KDE的话题&#xff08;或某一问题&#xff09;&#xff0c;然后KDE的开发者会被邀请参与这个话题。KE…

1091 Acute Stroke 需再做

这是BFS的典型应用场景&#xff1a;求给定矩阵中块(由相邻的点组成)的大小之和。不同的是这一次是三维。 判断是否邻接的依据是是否有公共边&#xff0c;还是可以用上增量数组的技巧 int X[6] {0,0,1,-1,0,0};//增量数组 int Y[6] {1,-1,0,0,0,0}; int Z[6] {0,0,0,0,1,-…

Ext UI 第一步

Code//Ext.onReady(function(){ var _panelnew Ext.Panel({ renderTo:Ext.getBody(), title:"XXX" });});空面板 加按钮方法:addButton(String/Object _config,Function _handler,Object _scope):添加一个按钮对象到面板Codevar loadfunction(){ …

深入浅出 Java Concurrency (29): 线程池 part 2 Executor 以及Executors[转]

Java里面线程池的顶级接口是Executor&#xff0c;但是严格意义上讲Executor并不是一个线程池&#xff0c;而只是一个执行线程的工具。真正的线程池接口是ExecutorService。 下面这张图完整描述了线程池的类体系结构。 首先Executor的execute方法只是执行一个Runnable的任务&…

WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口

原文:WPF的消息机制&#xff08;二&#xff09;- WPF内部的5个窗口之隐藏消息窗口版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/powertoolsteam/article/details/6109036 目录 WPF的消息机制&#xff08;一&#xff09;-让…

二叉树:root==NULL和*root==NULL的区别

root NULL 通常为查找的递归边界&#xff0c;说明当前结点不存在。 *root NULL 表明当且结点存在&#xff0c;但是内容不存在。是创建一棵二叉树时的初始化操作。 前者常用得多。

Intent携带额外的数据的方法

1、putExtras(Bundle data):向Intent中放入需要“携带”的数据。2、putXxx(String key,Xxx data):向Bundle放入Int、Long等各种类型的数据。3、putSerializable(String key,Serializable data):向Bundle中放入一个可序列化的对象。转载于:https://www.cnblogs.com/ahao214/p/41…

为什么 JavaScript 的私有属性使用 # 符号

这几天 JavaScript 的私有属性又成为了前端社区热议的话题。原因很简单&#xff0c;这家伙长这样&#xff1a; 惊不惊喜&#xff01;意不意外&#xff01; 而且 TC39 委员会以及对此达成了一致意见&#xff0c;并且该提案已经进入了 stage 3。在 es 规范阶段 stage 3 是候选提案…

程序员感悟----路该怎么走

有一句话我一直记得很深&#xff0c;“当人深处迷茫之中时早已不再迷茫”。很绕很矛盾的话&#xff0c;也可能有人听到后会马上跳脚喊&#xff0c;我一直迷茫怎么还是迷茫呢&#xff1f;呵呵。静一下想一下再喊。 大家都这么大了&#xff0c;路该怎么走&#xff0c;你知道么&am…

1020 Tree Traversals

1. 有这样一个经典结论&#xff1a;中序序列可以和先序序列、后序序列、层序序列中的任意一个来构建唯一的二叉树&#xff0c;而后三者两两搭配或者三个一起上都不行。因为从本质上来说&#xff0c;后三者都只提供根结点&#xff0c;只有通过中序才能区分左右子树。 2. 本题用…

Android添加权限大讲解

http://bbs.51cto.com/thread-1096739-1.html 对于新手来说&#xff0c;最烦恼的不是如何从网上下载到安卓项目&#xff0c;而是下载到的安卓项目不知道如何添加权限和要添加哪些权限。现在就针对安卓的权限来讲解这些权限应该具体用在什么地方 首先在项目下找到 AndroidManife…

经典算法之选择排序

问题 有一数组a&#xff0c;长度为n&#xff0c;把数组中的元素从大到小重新排列 思路 选择排序十分容易理解。可以理解为有一个盘子&#xff0c;里面装着很多钻石&#xff0c;你可以从里面拿钻石&#xff0c;但一次只可以拿一颗。第一次你当然会拿最大的出来了&#xff0c;第二…

PHP 读写数据库出现中文乱码问题

一、我在PHP读写数据库时&#xff0c;出现中文乱码问题的解决方案&#xff1a; 1、加入一句话就行了&#xff1a; mysql_query("set character set utf8");//读库 mysql_query("set names utf8");//写库 //其实读写都可以只加入 m…

1086 Tree Traversals Again

1. 这题的核心部分是&#xff0c;根据二叉树的先序序列和中序序列求后序序列。等于是在1020 Tree Traversals这一题的基础上&#xff0c;把怎么得到先序序列和中序序列的难度加大了&#xff0c;不是直接给出&#xff0c;而是要曲折一点得到。 2. 先序序列的得到就是把Push后面…

Eclipse的Java工作集和多工程构建路径

一、Java工作集&#xff1a; Eclipse有一个小功能&#xff0c;就是创建Java Working Set。它的作用是解决Package Explorer窗格中创建很多工程时出现拥挤的麻烦。 在创建&#xff08;New对话框&#xff09;时可以加入原来存在的Java工程。创建完后&#xff0c;在左方Package Ex…

ORA-08002: sequence MySeq.currval is not yet defined in this session

2019独角兽企业重金招聘Python工程师标准>>> MySeq.currval 从你的会话中的MySeq序列获取最新的值并返回&#xff0c;因此&#xff0c;它未曾被定义&#xff0c;直到你在你的会话中至少一次用MySeq.NEXTVAL获取一个值。CURRVAL的目的是让你在你的代码中使用某个序列…

【Vegas原创】exp时,ORA-00932: 数据类型不一致解决方法

现象&#xff1a; EXP-00056: 遇到 ORACLE 错误 932 ORA-00932: 数据类型不一致: 应为 BLOB, CLOB, 但却获得 CHAR EXP-00000: 导出终止失败 解决方法&#xff1a; 运行2个脚本&#xff1a; SQL> ?/rdbms/admin/catmetx.sql SQL> ?/rdbms/admin/utlrp.sql 转载于:htt…

1102 Invert a Binary Tree 需再做

1. 题目的输入是&#xff0c;先给出结点总数N&#xff0c;然后N行给出的是值为x&#xff08;0<x<N-1&#xff09;的结点的左右结点的值&#xff0c;若不存在左/右结点&#xff0c;则值为 - 。 2. 这一题我用动态链表没有做出来&#xff0c;根据参考书提示改用静态链表。…

iOS安全攻防(八)Thoes的Logos简介

个人原创&#xff0c;转帖请注明来源:cnblogs.com/jailbreaker 上一篇帖子&#xff0c;讲到使用iOSOpenDev开发基于Theos的Tweak,功能Hook了SpringBoard的 -(void)applicationDidFinishLaunching:(id)application。 先简单讲一下Hook,Hook中文翻译为“钩子”&#xff0c;非常形…

Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)

1.1.13编写一段代码&#xff0c;打印出一个M行N列的二维数组的转置(交换行和列&#xff09;。public class Test{public static void main(String[] args){//初始化int MInteger.parseInt(args[0]);int NInteger.parseInt(args[1]);String[][] arraynew String[M][N];for (int…

1053 Path of Equal Weight

1. 以下两组关系很大的概念 树的深度优先搜索 - 先根遍历 - 递归 树的广度优先搜索 - 层序遍历 - 非递归 本题考察的是前者&#xff0c;我设置了这样一个结构体 struct Prestruct{int totalWei 0;vector<int> pre; };Prestruct pre[maxn]; pre[idx].pre向量存放父节…

MapXtreme 2005 学习心得 在地图上创建点/线并显示标注(五)

新建示例 1&#xff1a;新建项目 新建一个网站&#xff0c;选择MapXtreme 6.7.1 Web Application在App_Code中&#xff0c;我们新建一个类&#xff0c;起名叫:LayerManager.cs2&#xff1a;把上节函数放到类LayerManager中 把上一节的函数代码全copy过来&#xff0c;还有using的…

无人驾驶——对frenet坐标的理解

好的确定车和路之间的关系&#xff0c;我们通常将车辆的在大地坐标坐标转化为车辆和道路之间的frenet坐标。 可能有人会疑问为什么转换后就方便了呢&#xff1f;我们来看一个例子。 在大地坐标下&#xff1a; 无人车首先要知道红色车的位置。通过传感器得到目标在车辆坐标系下的…

1079 Total Sales of Supply Chain

1. 这道题考察的是树的层次遍历&#xff0c;结点需要有层这个属性&#xff0c;对于我来说&#xff0c;难点在于什么时候给层赋值&#xff0c;看书后知道应该是在加入队列之前(不管是根节点还是之后所有节点)。 2. 一开始算得216&#xff0c;原因是把r直接加一当作底数&#xf…

在VS下用C语言连接SQLServer2008

在VS下用C语言连接SQLServer2008 原文:在VS下用C语言连接SQLServer2008 step1:启动SQLSERVER服务 step2:打建立数据库test,在test库中建立test表(a varchar(200),b varchar(200)) step3:建立系统DSN,开始菜单 ->运行 ->odbcad32, 添加->SQL SERVER Native Client 1…

canvas.width和canvas.style.width区别以及应用

今天讲的内容是canvas.width和canvas.style.width的区别&#xff0c;在没有做canvas项目之前&#xff0c;其实我是并没有深入了解过这两个属性的&#xff0c;最近在研究canvas项目的自适应问题&#xff0c;尤其是在canvas中置入图片&#xff0c;碰到了图片模糊的问题&#xff0…

vj p1042捕风捉影 题解

原体叙述 题意就是让你找出m,n之间的既是回文数又是素数的数 此题完全可以打表。除打表外&#xff0c;方法如下&#xff1a; 构成法 根据数学知识可知&#xff0c;如果一个回文数为偶数位&#xff0c;则必然能被11整除。 即所找的结果必为奇数位。 这样&#xff0c;大致方法就出…

1090 Highest Price in Supply Chain 需再做

1. 由于用不上结点的数据域&#xff0c;所以可以只用整型向量数组存放每一个结点的子节点下标即可。 2. 涉及到层次&#xff0c;未必用层次遍历&#xff0c;本题用先根遍历&#xff0c;也就是深度优先代码更优雅。 3. 这题创建树未必难&#xff0c;但是题目有一句话必须读懂e…