基于BFS的最短路径搜索[C++]

2023-05-16

基于C++实现BFS的最短路径搜索时,可以使用STL中的优先队列priority_queue,优先队列按照小顶堆,即路径短的优先取出。其中节点可以用结构体定义,结构体中存储节点的位置、路径长度、最短路径的前序节点等信息,构建结构体的时候记得重载小于号,即可直接在优先队列中使用,具体代码如下:

其中,起点为左上角,终点为右下角,障碍物通过值设置为9999,可以根据题目的要求设置为一个非常大的值

#include<bits/stdc++.h>
using namespace std;
struct node{
  int x;
  int y;
  int prex;///前序节点x
  int prey;///前序节点y
  int val;///到该处路径的代价
  bool operator < (const node &x) const{
        return val > x.val;
  }
}S[16][16];
vector<vector<int> > array(16);
priority_queue<node> q;
int M,N;
void judge(int xadd, int yadd, int val, int px, int py){
    int x = px + xadd;
    int y = py + yadd;
    if(x<0||y<0||x>=M||y>=N){
      return;
    }
   // cout<<val<<" "<<array[x][y]<<" "<<S[x][y].val<<endl;
    if(val+array[x][y]<S[x][y].val){
       S[x][y].val = val+array[x][y];
       S[x][y].prex = px;
       S[x][y].prey = py;
       q.push(S[x][y]);
    }
    return;
}
void route(int x, int y){
    if(x<0||y<0){
        return;
    }
    route(S[x][y].prex, S[x][y].prey);
    if(!(x==0&&y==0)){
       cout<<" ";
    }
    cout<<"("<<x<<","<<y<<")";
}
int main(){
    while(cin>>M>>N){
        ///数组读取
        for(int i=0;i<M;i++){
            array[i].clear();
            array[i].resize(N);
            for(int j=0;j<N;j++){
               cin>>array[i][j];
               S[i][j].x = i;
               S[i][j].y = j;
               S[i][j].prex = -1;
               S[i][j].prey = -1;
               S[i][j].val = 9999;
            }
        }
        ///最短路
        while(!q.empty()) q.pop();
        S[0][0].val = 0;
        q.push(S[0][0]);
        while(!q.empty()){
          //  cout<<q.top().x<<" "<<q.top().y<<endl;
            node temp = q.top();
            q.pop();
            judge(-1, 0, temp.val, temp.x, temp.y);
            judge( 1, 0, temp.val, temp.x, temp.y);
            judge( 0, 1, temp.val, temp.x, temp.y);
            judge( 0,-1, temp.val, temp.x, temp.y);
        }
        if(S[M-1][N-1].val>5000){
          cout<<"-1"<<endl;
        }else{
          route(M-1,N-1);
          cout<<endl;
        }
    }
}
/*
7 5
0 1 1 1 1
8 1 4 9 7
4 9999 9999 5 1
1 1 6 9999 6
2 9999 3 9999 4
4 3 9999 5 3
4 2 3 2 0



*/

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

基于BFS的最短路径搜索[C++] 的相关文章

  • 洛谷 P1825 [USACO11OPEN]Corn Maze S(bfs)

    题目传送 1 这仅仅是一道加了传送门的bfs 2 仅仅加了一个传送门 xff0c 就卡了我一下午 3 门存在不成对的情况 span class token macro property span class token directive
  • 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的最短路径搜索[C++]

    基于C 43 43 实现BFS的最短路径搜索时 xff0c 可以使用STL中的优先队列priority queue xff0c 优先队列按照小顶堆 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
  • C语言DFS和BFS解决迷宫问题

    C语言DFS与BFS 迷宫问题 题目描述 给定一个 N times MN M 方格的迷宫 xff0c 迷宫里有 TT 处障碍 xff0c 障碍处不可通过 在迷宫中移动有上下左右四种方式 xff0c 每次只能移动一个方格 数据保证起点上没有障
  • dfs和bfs能解决的问题

    一 理解暴力穷举之dfs和bfs 暴力穷举 暴力穷举是在解决问题中最常用的手段 xff0c 而dfs和bfs算法则是这个手段的两个非常重要的工具 其实 xff0c 最简单的穷举法是直接遍历 xff0c 如数列求和 xff0c 遍历一个数组即
  • Olya and Energy Drinks【Codeforces 877D】【BFS+思维+剪枝】

    Codeforces Round 442 Div 2 D 这天给学弟学妹们出了这道题 没想到背锅了 感觉要0A了 QAQ 确实 今天我再次写的时候也WA了好几发 哎 这锅背了 看到有些的代码code 访问过的点都标记为mp x y 但是这样
  • 2019年第十届蓝桥杯省赛A组(C/C++组)迷宫(BFS)

    试题 D 迷宫 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从一个位置走到这 个它
  • 汽车加油行驶问题【网络流24题】【可以使用BFS】

    题目链接 这道题虽然说是网络流24题中的一题 但是我的第一想法确实去用BFS 跑一个最小的花费 但是由于加油的钱 向后走的钱 开设一个新的加油站的钱是不固定的 所以 我们需要进行相应的判断 跑所有可以达到终点的值去比较大小 include
  • 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
  • 璀璨光滑【牛客】【题意解析+BFS+贪心】

    题目链接 中文题意 表面平静 实则暗藏玄机 而打开本题的突破口 也确确实实就在于题目的描述 也就是说 这张图的边的数目是确定的 并且这是一张连通图 而且图上的个点每个点连接出去的边的数目都是条 因为每个数都刚好只与个数在二进制位上差1 那么
  • LeetCode第127题解析

    给定两个单词 beginWord 和 endWord 和一个字典 找到从 beginWord 到 endWord 的最短转换序列的长度 转换需遵循如下规则 每次转换只能改变一个字母 转换过程中的中间单词必须是字典中的单词 说明 如果不存在这
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1
  • 2020蓝桥杯模拟——长草

    1 题目描述 小明有一块空地 他将这块空地划分为 n 行 m 列的小块 每行和每列的长度都为 1 小明选了其中的一些小块空地 种上了草 其他小块仍然保持是空地 这些草长得很快 每个月 草都会向外长出一些 如果一个小块种了草 则它将向自己的上
  • 境界的彼方_lduoj_bfs宽搜

    Description wyy是一个著名动画 境界的彼方 的男主 此时他非常的慌张 因为女主栗山未来进入了境界的彼方内部 并且花费了大量的血量去拯救wyy wyy此时也进入了境界的彼方 他妈给了他一张地图去寻找境界的彼方的核心去拯救女主 现
  • PowerOJ2512: 小红灌溉【染色】

    题目链接 划重点 每个有菜的点只能浇一次且恰好一次 所以意思就是 譬如某个菜的位置是 x y 那么 行x 列y的浇水方案只能使用其中的一个 以此类推 我们给每个有蔬菜的位置的 x y 的x点与y点链接一条无向边 代表x和y只能选择其中的一个
  • 长草(Python)

    题目描述 小明有一块空地 他将这块空地划分为 n 行 m 列的小块 每行和每列的长度都为 1 小明选了其中的一些小块空地 种上了草 其他小块仍然保持是空地 这些草长得很快 每个月 草都会向外长出一些 如果一个小块种了草 则它将向自己的上 下
  • LeetCode——1302. 层数最深叶子节点的和

    题目描述 给你一棵二叉树的根节点 root 请你返回层数最深的叶子节点的和 示例 1 输入 root 1 2 3 4 5 null 6 7 null null null null 8 输出 15 示例 2 输入 root 6 7 8 2 7
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner

随机推荐

  • 选数问题 Gym - 270437C

    题意 xff1a 给定n个正整数 xff0c 从中选取K个数 xff0c 保证这K个数的和是S 求有多少种选择的方法 Input 第一行输入一个整数T T lt 61 100 xff0c 表示有T个测试样例 对于每个例子 xff0c 有两行
  • 掌握魔法的东东II Gym - 101510B

    题意 xff1a 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 x
  • 传递闭包 Floyd算法

    题意 xff1a 众所周知 xff0c TT 有一只魔法猫 这一天 xff0c TT 正在专心致志地玩 猫和老鼠 游戏 xff0c 然而比赛还没开始 xff0c 聪明的魔法猫便告诉了 TT 比赛的最终结果 TT 非常诧异 xff0c 不仅诧
  • csp m2 咕咕东的奇妙序列 二分

    题意 xff1a 题目描述 咕咕东 正在上可怕的复变函数 xff0c 但对于稳拿A Plus的 咕咕东 来说 xff0c 她早已不再听课 xff0c 此时她在睡梦中 突然想到了一个奇怪的无限序列 xff1a 112123123412345
  • A - 咕咕东的目录管理器

    题意 xff1a 样例输入 xff1a span class token number 1 span span class token number 22 span MKDIR dira CD dirb CD dira MKDIR a MK
  • ssh密钥对

    SSH密钥 1 生成ssh密钥对 不要私钥密码 连续回车 win git ssh keygen t rsa b 4096 C 34 yourname or youremail 34 34 qs 64 Dell MINGW64 span cl
  • C - 公园坐椅子

    题意 xff1a SDUQD 旁边的滨海公园有 x 条长凳 第 i 个长凳上坐着 a i 个人 这时候又有 y 个人将来到公园 xff0c 他们将选择坐在某些公园中的长凳上 xff0c 那么当这 y 个人坐下后 xff0c 记k 61 所有
  • week12 hw 必做题1,2

    题意 xff1a 给出n个数 xff0c zjm想找出出现至少 n 43 1 2次的数 xff0c 现在需要你帮忙找出这个数是多少 xff1f Input 本题包含多组数据 xff1a 每组数据包含两行 第一行一个数字N 1 lt 61 N
  • week13 hw必做1,2

    题意 xff1a 这一天 xff0c TT 遇到了一个神秘人 神秘人给了两个数字 xff0c 分别表示 n 和 k xff0c 并要求 TT 给出 k 个奇偶性相同的正整数 xff0c 使得其和等于 n 例如 n 61 10 xff0c k
  • week14限时模拟 猫睡觉问题 HDU - 3700

    题意 xff1a 众所周知 xff0c TT家里有一只魔法喵 这只喵十分嗜睡 一睡就没有白天黑夜 喵喵一天可以睡多次 xff01 xff01 每次想睡多久就睡多久 喵睡觉的时段是连续的 xff0c 即一旦喵喵开始睡觉了 xff0c 就不能被
  • CSP M4 C 宇宙狗的危机

    题意 xff1a 描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处 xff0c 虽然宇宙狗凶神恶煞 xff0c 但是宇宙狗有一个很可爱的女朋友 最近 xff0c 他的女朋友得到了一些数 xff0c 同时 xff0c 她还很喜欢树 xf
  • csp 201809-3 元素选择器

    题意 xff1a 思路 xff1a 这道题的解决应该分为建树 43 查找两部分 关于建树 xff0c 为了方便后代选择器的查找 xff0c 采用儿子记录父节点的方法 xff0c 即每个节点记录自己的父节点位置 采用数组描述这棵树 xff0c
  • csp 201312-4有趣的数

    题意 xff1a 问题描述 我们把一个数称为有趣的 xff0c 当且仅当 xff1a 1 它的数字只包含0 1 2 3 xff0c 且这四个数字都出现过至少一次 2 所有的0都出现在所有的1之前 xff0c 而所有的2都出现在所有的3之前
  • C++20中的协程

    一 协程 在谷歌的Golang中 xff0c 如果大家说他的特点有啥 xff0c 肯定绕不过协程 而在此之前 xff0c 大多数的语言一般是从多进程讲到多线程 xff0c 一般来说 xff0c 对某个语言掌握的深度 xff0c 就看在多线程
  • RUST网络客户端的基本技术说明

    一 客户端的说明 上文中的网络客户端 xff0c 其实就是一个比较简单的TCP通信客户端 xff0c 原来为了实现和服务端的通信 xff0c 增加了相关的通信协议的相关内容 xff0c 在这里分析时 xff0c 可以忽略掉 xff0c 毕竟
  • 跟我学c++中级篇——再谈Concepts

    一 理解Concepts 可能很多的c 43 43 程序员到职业生涯结束 xff0c 都没有真正写过模板程序 xff0c 有一些甚至都没有听说过模板 这个很正常 xff0c 特别是一些参与c开发的c 43 43 程序员更是如此 不过 xff
  • win10软链接

    win10软链接 C gt mklink 创建符号链接 MKLINK D H J Link Target D 创建目录符号链接 默认为文件 符号链接 H 创建硬链接而非符号链接 J 创建目录联接 Link 指定新的符号链接名称 Target
  • Maven项目引用本地jar包依赖打包警告should not point at files within the project directory

    Maven项目引用本地jar包依赖打包警告Some problems were encountered while building the effective model for com xxx xxx xxx xxx jar shoul
  • make collect2: ld terminated with signal 9 错误解决办法

    make collect2 ld terminated with signal 9 错误解决办法 echo579 博客园 原因 xff1a signal 9 错误是由于交换区空间不足导致 xff0c 扩展交换区大小即可 解决方法搬运自Lin
  • 基于BFS的最短路径搜索[C++]

    基于C 43 43 实现BFS的最短路径搜索时 xff0c 可以使用STL中的优先队列priority queue xff0c 优先队列按照小顶堆 xff0c 即路径短的优先取出 其中节点可以用结构体定义 xff0c 结构体中存储节点的位置