acwing算法基础之搜索与图论--BFS

目录

  • [1 基础知识](#1 基础知识)
  • [2 模板](#2 模板)
  • [3 工程化](#3 工程化)

1 基础知识

BFS可以用来求取最短路,前提条件是所有边的权重一样。

2 模板

题目1:走迷宫,从左上角走到右下角,求最短路。

cpp 复制代码
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

const int N = 110;
int d[N][N];
int g[N][N];
int n, m;

int bfs() {
    memset(d, -1, sizeof d);
    
    queue<pair<int,int>> q;
    q.push({0,0});
    d[0][0] = 0;
    
    int dir[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
    
    while (!q.empty()) {
        auto t = q.front();
        q.pop();
        
        //t下一步可以走到哪儿
        for (int k = 0; k < 4; ++k) {
            int x = t.first + dir[k][0], y = t.second + dir[k][1];
            if (x >= n || x < 0 || y >= m || y < 0) continue;
            if (g[x][y] == 1) continue;
            if (d[x][y] != -1) continue;
            d[x][y] = d[t.first][t.second] + 1;
            q.push({x,y});
        }
    }
    
    return d[n-1][m-1];
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> g[i][j];
        }
    }
    
    cout << bfs() << endl;
    
    return 0;
}

扩展写法:输出最短路的路径。

cpp 复制代码
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

const int N = 110;
int d[N][N];
int g[N][N];
int n, m;
pair<int,int> before[N][N]; //存储前一个结点

int bfs() {
    memset(d, -1, sizeof d);
    
    queue<pair<int,int>> q;
    q.push({0,0});
    d[0][0] = 0;
    
    int dir[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
    
    while (!q.empty()) {
        auto t = q.front();
        q.pop();
        
        //t下一步可以走到哪儿
        for (int k = 0; k < 4; ++k) {
            int x = t.first + dir[k][0], y = t.second + dir[k][1];
            if (x >= n || x < 0 || y >= m || y < 0) continue;
            if (g[x][y] == 1) continue;
            if (d[x][y] != -1) continue;
            d[x][y] = d[t.first][t.second] + 1;
            
            before[x][y] = t;
            
            q.push({x,y});
        }
    }
    
    //输出最短路的路径
    int i = n - 1, j = m - 1;
    while (i | j) {
        cout << "i = " << i << ", j = " << j << endl;
        pair<int,int> t = before[i][j];
        i = t.first;
        j = t.second;
    }
    
    return d[n-1][m-1];
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> g[i][j];
        }
    }
    
    cout << bfs() << endl;
    
    return 0;
}

题目2:八数码。

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>

using namespace std;

int bfs(string start) {
    queue<string> q;
    q.push(start);
    
    unordered_map<string, int> d;
    d[start] = 0;
    
    string end = "12345678x";
    
    int dirs[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
    
    while (!q.empty()) {
        string t = q.front();
        q.pop();
        
        if (t == end) {
            return d[t];
        }
        
        //t可以走到哪儿,可以走到new_t
        int idx = t.find('x');
        int i = idx / 3, j = idx % 3;
        for (int k = 0; k < 4; ++k) {
            int x = i + dirs[k][0], y = j + dirs[k][1];
            if (x < 0 || x >= 3 || y < 0 || y >= 3) continue;
            string new_t = t;
            swap(new_t[idx], new_t[x * 3 + y]);
            if (d.count(new_t)) continue;
            
            d[new_t] = d[t] + 1; //可以走到new_t
            q.push(new_t);
        }
    }
    
    return -1;
}

int main() {
    string start = "";
    char c;
    for (int i = 0; i < 9; ++i) {
        cin >> c;
        start += c;
    }
    
    cout << bfs(start) << endl;
    
    return 0;
}

3 工程化

暂无。。。

相关推荐
lxmyzzs1 小时前
【图像算法 - 23】工业应用:基于深度学习YOLO12与OpenCV的仪器仪表智能识别系统
人工智能·深度学习·opencv·算法·计算机视觉·图像算法·仪器仪表识别
Learn Beyond Limits1 小时前
Multi-output Classification and Multi-label Classification|多输出分类和多标签分类
人工智能·深度学习·神经网络·算法·机器学习·分类·吴恩达
张较瘦_1 小时前
[论文阅读] 软件工程 | GPS算法:用“路径摘要”当向导,软件模型检测从此告别“瞎找bug”
论文阅读·算法·bug
2401_858286112 小时前
OS26.【Linux】进程程序替换(下)
linux·运维·服务器·开发语言·算法·exec·进程
张同学的IT技术日记2 小时前
【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++
算法
极客BIM工作室2 小时前
强化学习算法分类与介绍(含权重更新公式)
算法·分类·数据挖掘
KarrySmile2 小时前
Day8--HOT100--160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点
数据结构·算法·链表·双指针·快慢指针·hot100·灵艾山茶府
luckycoding3 小时前
1424. 对角线遍历 II
算法·leetcode·职场和发展
CoovallyAIHub3 小时前
基于ICR损失与SVMLP数据集:小目标检测新突破,车牌检测准确率显著提升
深度学习·算法·计算机视觉
鲸鱼24013 小时前
贝叶斯笔记
人工智能·算法·机器学习