【算法入门搜索法】走迷宫|单源最短路径1

news2024/12/27 1:37:05

✅作者简介:热爱后端语言的大学生,CSDN内容合伙人
✨精品专栏:C++面向对象
🔥系列专栏:算法百炼成神

文章目录

  • 🔥前言
  • 1、AB20 走迷宫
    • 1.1、解题思路
    • 1.2、代码实现与注释
  • 2、AB19 【模板】单源最短路1
    • 2.1、单源最短路汇总

🔥前言

本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面试真题,面试、找工作完全可以来这里找机会。此外,网站内的编码主题多样化,调试功能可运用性强,可谓是非常注重用户体验。这么好的免费刷题网站还不快入手吗,快去注册开启算法百炼成神之路吧!

1、AB20 走迷宫

广度优先算法实现,充分利用邻接矩阵

题目链接:走迷宫

在这里插入图片描述在这里插入图片描述

1.1、解题思路

本题求的是起点到最终点所需要走的最小步数,那就必然少不了邻接矩阵的使用与点移动的逻辑,而整体上是广度优先算法来实现,需要利用队列:

  • 根据网格大小确定邻接矩阵的大小并初始化全都未被访问:
    • 用标记数组flag来记录位置是否被访问过
  • 使用对组pair表示横纵坐标:
    • 纵坐标正方向用第一个变量表示,横坐标正方向用第二个变量表示
    • 相当于点(x,y)在第四象限的移动,x在竖轴,y在横轴移动
  • 每个位置都要进行四周的移动,因此要设计移动逻辑:
    • 不妨定义两个数组,通过-101 的组合确定移动方向
    • 访问到未被访问的坐标就把其入队并将布尔值设为true,避免重复访问
      • 该点的距离根据起始点的距离进行加一,终点的距离就是最终结果

1.2、代码实现与注释

本题源码:

#include <iostream>
#include <cstring> // 引入memset函数的头文件
#include <queue>
using namespace std;
queue<pair<int, int>> q;
const int N = 1001;
int  w[N][N]; // 代表矩阵中起点到各点最短距离
char a[N][N]; // 用来输入*或者. (障碍和通路)
bool b[N][N]; // 标志位,记录坐标是否被访问过

int xs, ys, xt, yt; // s 代表起始点,t代表终点
int n, m;

// 注意dx和dy数组存放的数据要对应,代表着上下左右的移动方向
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

// 核心算法:广度优先
int bfs() {
    memset(w, -1, sizeof(w)); // 初始距离全部设为-1
    memset(b, 0, sizeof(b));  // 初始邻接矩阵全部设为未访问
    b[xs][ys] = 1;
    q.push(make_pair(xs, ys));
    while (!q.empty()) {
        int x1, y1;
        x1 = q.front().first, y1 = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int x2 = x1 + dx[i], y2 = y1 + dy[i];
            if (x2 >= 1 && x2 <= n && y2 >= 1 && y2 <= m && b[x2][y2] == false &&
                    a[x2][y2] == '.') {
                b[x2][y2] = true;
                w[x2][y2] = w[x1][y1] + 1;
                q.push(make_pair(x2, y2));
            }
        }
    }
    return w[xt][yt] + 1;
}

int main() {
    cin >> n >> m;
    cin >> xs >> ys >> xt >> yt;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    if (bfs() == 0)
        cout << "-1" << endl;
    else
        cout << bfs();
    return 0;
}

重要注释:

  • 将各种矩阵与变量定义在 main 函数以外,这样可以使用无参的bfs函数,省去了传参过程
  • memset 函数常用于给存储空间快速赋值,比较典型的就是配合数组进行初始化
  • 坐标方面的细节:
    • (-1,0)、(1,0)、(0,-1)、(0,1)分别表示上移、下移、左移、右移

2、AB19 【模板】单源最短路1

之前发过单源最短路2,最短路1与之的区别在于边的权值都是1

文章链接:图论入门

2.1、单源最短路汇总

边权值相同的解题源码:

#include <iostream>
#include<climits> // 使用INT_MAX所需要引入的头文件
const int MAX = 5001;
using namespace std;


int main() {
    int G[MAX][MAX];
    for (int i = 0; i < MAX; i++) {
        for (int j = 0; j < MAX; j++) {
            G[i][j] = INT_MAX;
        }
    }
    int n, m;
    cin >> n >> m;
    int u, v;
    for (int i = 1; i <= m; i++) {
        cin >> u >> v;
        G[u][v] = 1;
        G[v][u] = 1;
    }
    bool flag[MAX];
    int dist[MAX];
    for (int i = 1; i < MAX; i++) {
        dist[i] = G[1][i];
        flag[i] = false;
    }

    dist[1] = 0;
    flag[1] = true;
    for (int i = 2; i < MAX; i++) {
        int temp = INT_MAX, index = 1;
        for (int j = 1; j < MAX; j++) {
            if (flag[j] == false && dist[j] < temp) {
                temp = dist[j];
                index = j;
            }
        }
        if (index != 1) {
            flag[index] = true;
        }
        for (int i = 2; i < MAX; i++) {
            if (flag[i] == false && G[index][i] != INT_MAX) {
                if (G[index][i] + dist[index] < dist[i]) {
                    dist[i] = G[index][i] + dist[index];
                }
            }
        }
    }
    if (dist[n] == INT_MAX) {
        cout << -1;
    } else {
        cout << dist[n];
    }
    return 0;
}


上面链接中有权值不同的单源最短路详解,思路几乎一致,大家可以再去温习一波,这类题型也算是图论中的典型算法题目了。

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

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

相关文章

CMake中while/continue/break的使用

CMake中的while命令用于在条件为true时评估(evaluate)一组命令&#xff0c;其格式如下&#xff1a; while(<condition>)<commands> endwhile() 在while和匹配的endwhile之间的所有命令都被记录下来而不被调用。一旦评估了endwhile&#xff0c;只要<condition&g…

MIT 6.S081 Operating System Lecture4 (随意的笔记)

系列文章目录 文章目录系列文章目录xv6 中的内存页是如何分配的RISC-V 是多级页表对page table的理解xv6 中的内存页是如何分配的 在本课中&#xff0c;内存也相关源码路径为&#xff1a; kernel/kallo.c // Physical memory allocator, for user processes, // kernel stack…

uni-app入门:wxs基本使用

1.wxs相关介绍 2.wxs标签内嵌在wxml中使用 3.在.wxs文件中外联使用 4.wxs与JavaScript区别 1.wxs相关介绍wxs(weixin script),是小程序的一套脚本语言&#xff0c;结合 WXML&#xff0c;可以构建出页面的结构。可以编写在 wxml 文件中的 标签内&#xff0c;或以…

Spring 项目的创建和 “使用“

目录 1. 创建 Spring 项目 1.1 创键一个 Maven 项目【无需模板】 1.2 添加 Spring 依赖【Spring-context/Spring-beans】 1.3 创建一个启动类 2. 将对象存储到 Spring 中 2.1 创建一个 bean 对象 2.2 将 bean 注册到 Spring 中【使用 Spring 配置文件进行注册】 3. 从 …

【树莓派不吃灰】命令篇⑧ 校准树莓派时间

目录1. systemd-timesyncd1.1 systemd-timesyncd 客户端1.2 systemd-timesyncd 服务1.3 systemd-timesyncd 配置文件1.4 timedatectl命令2. 校准时间2.1 查看时间状态2.2 校准时区2.3 没有时钟同步服务器&#xff0c;手工设置时间2.3.1 禁止ntp自动同步2.3.2 设置时间2.3.3 设置…

敏感词检测库ToolGood.Words中IllegalWordsSearch类使用简介

C#开源敏感词检测库ToolGood.Words中的类IllegalWordsSearch为过滤非法词&#xff08;敏感词&#xff09;专用类&#xff0c;可设置跳字长度&#xff0c;支持全角转忽略大小、跳词、重复词、黑名单等功能&#xff0c;本文对照参考文献1&#xff0c;对该类的用法进行简要介绍。 …

k8s资源对象service-四层负载均衡详解

理论 工作原理如图: service的定义:是一组pod的逻辑组合,通过clusterIP和服务端口接收请求,并将这些请求代理至使用标签选择器来过滤符合条件的pod对象。 作用:服务发现和服务访问,为弹性变动且存在生命周期的pod对象提供了一个固定的访问接口。 service的代理类型:…

Vue动态切换class属性:数组法、对象法

需求&#xff1a;在style里创建好不同的属性&#xff0c;后期可以给标签动态绑定这些属性&#xff0c;也可以实现属性的切换方法&#xff1a;对象法、数组法事先创建好class属性&#xff1a; <style>.aa{}.bb{}.cc{} </style> 对象法&#xff1a; <body><…

矩阵(加速)。。。

我限定你在明天中午之前搞定这东西&#xff01;毕竟之前做过了欸。矩阵&#xff0c;一个看起来很神奇的东西&#xff0c;不过我不打算花太多的时间做这个&#xff0c;还是图论和数论好点儿&#xff0c;还要复习一下之前的数据结构和dp呢。那么先谈谈定义&#xff0c;定义一个矩…

kubernetes介绍与资源管理

#kubernetes介绍与资源管理 1应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;…

CMSC5713-IT项目管理之人力资源管理Human Resources Management

文章目录9.1. Introduction9.1.1. Motivation Theories9.1.2. Influence and Power9.1.3. Motivating Team9.2. Project Human Resource Management9.3. Human Resource Planning9.3.1. Project Organization Charts9.3.2. Responsibility Assignment Matrices9.3.2.1. RACI Ch…

锐捷BFD基础实验配置

目录 BFD与静态路由联动 BFD与静态路由联动&#xff08;单跳&#xff09; BFD与静态路由联动&#xff08;多跳&#xff09; BFD与动态路由联动 配置BFD与OSPF联动 配置BFD与BGP联动 BFD与静态路由联动 BFD联动静态路由注意事项 1、配置需要联动的静态路由时&#xff0c…

Java线程池

自定义线程池 1. 简介 1.1 引入原因 1. 一个任务过来&#xff0c;一个线程去做。如果每次过来都创建新线程&#xff0c;性能低且比较耗费内存 2. 线程数多于cpu核心&#xff0c;线程切换&#xff0c;要保存原来线程的状态&#xff0c;运行现在的线程&#xff0c;势必会更加耗…

idea创建spring boot工程及配置

目录 一、dea 创建spring boot工程 二、打包 三、启动配置文件 一、dea 创建spring boot工程 new project 选择Spring Initializr ,Type&#xff1a;选择Maven&#xff0c;Java 8, Packagin 选择Jar。然后点击next 添加依赖&#xff1a; 选择Sprint Boot版本&#xff0c;选…

差分约束算法

差分约束是为了解决这样一组不等式问题&#xff1a; 这个咋解决》我们来看 对于某个下标k而言&#xff0c;提取出关于其的所有不等式&#xff0c;&#xff08;其中xk在第一个),也就是 xk-x1<m1 xk-x2<m2 xk-x3<m3....对于这些不等式相当于是 xk取min(x1m1,x2m2,x3m3…

面试常问:HTTPS的加密过程 ----- 光明和黑暗的恩怨情仇

目录 关于运营商劫持 &#xff1a; 什么是运营商劫持?? 什么是运营商? 为什么要劫持? 如何劫持? 劫持的危害 互联网公司怎么办? HTTPS 什么是HTTPS 一些概念&#xff1a; HTTPS加密 1. 对称加密&#xff1a; 2. 非对称加密 3. 非对称加密对称加密 4. 加密…

基于java+ssm购物商城网站系统-计算机毕业设计

项目介绍 乐优购物商城是商业贸易中的一条非常重要的道路&#xff0c;可以把其从传统的实体模式中解放中来&#xff0c;网上购物可以为消费者提供巨大的便利。通过乐优购物商城这个平台&#xff0c;可以使用户足不出户就可以了解现今的流行趋势和丰富的商品信息&#xff0c;为…

请求跨域问题

在前端请求接口时&#xff0c;出现跨域是很常见的问题&#xff0c;跨域的解决方法也很多&#xff0c;但是目前通用的是以下两种方式&#xff1a; 开发环境生产环境在服务端配置 CORS在服务端配置 CORS配置开发服务器代理&#xff0c;比如 vite-server.proxy配置生产服务器代理…

Debezium的增量快照

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 如常 Debezium Incremental snapshotting Introduction CDC&#xff08;Change-Data-Capture&#xff09;正…

Java之反射相关知识补充

Java之反射一、概述1、静态语言和动态语言1.1 静态语言1.2 动态语言2、Reflection(反射)2.1 介绍2.2 流程2.3 Java反射机制提供的功能2.4 优缺点&#xff08;1&#xff09;优点&#xff08;2&#xff09;缺点2.5 反射相关主要API2.6 示例二、反射相关操作1、获取Class类的实例1…