宽度优先搜索基础

宽度优先搜索和深度优先搜索的区别是,宽度优先要先让当前点横向到达所有可以一步到达的点,判断在这些点中是否有自己需要的终点(注意别重复走,要去重),如果有就停下来,这样可以找出最短路径,如果没有就将这些点放入队列中用于下一次的更新,也就是说每一次都是从一个点开始走到尽可能多的点上去

例题链接

思路:最小移动次数利用深度优先搜索即可,从开始点开始计算所有一步可以到达的点,打上标记,然后用一步可以到达的点去找所有可以两步到达的点,依此类推直到到达终点。这里需要注意的是,为什么某个点第一次被遍历它就一定是该点据起点的最短路径,这个问题结合队列的特性显而易见。

#include
#include
#include
#include
#include
#define x first
#define y second
using namespace std;
typedef pair PII;
const int N = 110;
int a[N][N];
int dist[N][N];
int n, m;
int bfs()
{
    memset(dist, -1, sizeof(dist));//将所有点距离起点的距离标记为-1,意为全部没有被遍历过
    dist[0][0] = 0;//将起点的距离改为0,用于后续其它点的距离的更新
    queue q;//队列
    q.push({0, 0});
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};//一个点可以走的四个方向的坐标变化
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        for(int i = 0; i < 4; i ++)
        {
            int x = t.x + dx[i], y = t.y + dy[i];
            if(x >= 0 && x < n && y >= 0 && y < m && a[x][y] == 0 && dist[x][y] == -1)//判断当前点是否越界,是否已经走过了
            {
                dist[x][y] = dist[t.x][t.y] + 1;
                q.push({x, y});
            }
        }
    }
    return dist[n - 1][m -1];//返回终点距离起点的距离
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
        for(int j = 0; j < m; j ++)
         scanf("%d", &a[i][j]);
    printf("%d\n", bfs());
    return 0;
}

Original: https://www.cnblogs.com/amour233/p/16469229.html
Author: LYL233
Title: 宽度优先搜索基础

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644221/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql (DDL)

    MYSQL (康老师-DDL) 创建和管理表 SELECT *FROM order; 1. 创建和管理数据库 1.1 如何创建数据库 方式1: CREATE DATABASE my…

    技术杂谈 2023年7月25日
    072
  • SQL查询语句–统计

    — 1、日统计查询填补 i->为时间差的天数 2022-05-10为终止时间 SET @i :=- 1; SELECT date_format( DATE_SUB( ’20…

    技术杂谈 2023年6月21日
    091
  • MySQL-sql_mode=only_full_group_by解决方式

    报错问题: SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and …

    技术杂谈 2023年6月21日
    0107
  • Atlassian Confluence 6.15.5 添加甘特图

    Atlassian Confluence 6.15.5 添加甘特图 Atlassian Confluence 编辑模式 工具栏 “+”→其它宏→视觉&amp…

    技术杂谈 2023年7月10日
    073
  • win10系统智能云输入法怎么卸载_win10卸载智能云输入法的方法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月31日
    098
  • xx

    http://news.xinhuanet.com/politics/2017-10/17/c_1121814199.htm Original: https://www.cnblo…

    技术杂谈 2023年5月31日
    085
  • Collection和Collections有什么区别?

    1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collec…

    技术杂谈 2023年5月30日
    094
  • PyTorch 介绍 | TRANSFORMS

    数据并不总是满足机器学习算法所需的格式。我们使用 transform对数据进行一些操作,使得其能适用于训练。 所有的TorchVision数据集都有两个参数,用以接受包含trans…

    技术杂谈 2023年7月25日
    077
  • Mac 更新node版本

    1,查看本机node.js版本 node -v 2,清除node.js的cache sudo npm cache clean -f 3,下载安装包直接安装 https://npm….

    技术杂谈 2023年6月1日
    083
  • 如何保持自己 fork 的项目和原始项目同步

    ============================================================================== 本博客已经废弃,不在维…

    技术杂谈 2023年6月1日
    0107
  • centospython3虚拟环境

    在使用 Python 语言时,通过 pip(pip3)来安装第三方包,但是由于 pip 的特性,系统中只能安装每个包的一个版本。但是在实际项目开发中,不同项目可能需要第三方包的不同…

    技术杂谈 2023年7月24日
    074
  • 享元模式之网店模板

    1、 实例概况 在天猫商城里存在着成天上万的网店,但是天猫所提供的网站模板是一样的,存在许多天猫网店使用同一个网店模板的情况,如果每一个网店都用一个网店对象来表示,因为网店数量巨大…

    技术杂谈 2023年7月23日
    091
  • GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看。支持cat、more、head…vim 目录的内容可以被查看。ls、tree w 文件的内容可以被添…

    技术杂谈 2023年6月21日
    0115
  • phpcms如何在前台文章列表前显示所属类别名称

    最近做单位网站模版遇到的问题,欲实现的效果: 但是phpcms中自带的文章列表标签没有这个功能,数据库中文章表中也只有类别id的字段,因此不能通过简单的{$r[catname]}读…

    技术杂谈 2023年7月11日
    071
  • QGIS的编译 (Windows)

    一、资源 https://github.com/qgis/QGIS https://github.com/qgis/QGIS/blob/master/INSTALL.md 二、编译…

    技术杂谈 2023年5月31日
    099
  • Vue教程老师笔记

    //全局前置守卫:初始化时执行、每次路由切换前执行 router.beforeEach((to,from,next)=>{ console.log(‘before…

    技术杂谈 2023年6月1日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球