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 工程化

暂无。。。

相关推荐
搂鱼1145149 小时前
GJOI 10.20/10.22 题解
算法
我搞slam9 小时前
插入区间--leetcode
算法·leetcode
前进之路99 小时前
Leetcode每日一练--40
算法·leetcode
Swift社区9 小时前
LeetCode 405 - 数字转换为十六进制数
算法·leetcode·职场和发展
赵杰伦cpp9 小时前
数据结构——二叉搜索树深度解析
开发语言·数据结构·c++·算法
大数据张老师9 小时前
数据结构——希尔排序
数据结构·算法·排序算法·1024程序员节
第七序章10 小时前
【C + +】unordered_set 和 unordered_map 的用法、区别、性能全解析
数据结构·c++·人工智能·算法·哈希算法·1024程序员节
草莓熊Lotso10 小时前
《算法闯关指南:优选算法--二分查找》--23.寻找旋转排序数组中的最小值,24.点名
开发语言·c++·算法·1024程序员节
文火冰糖的硅基工坊11 小时前
[嵌入式系统-150]:智能机器人(具身智能)内部的嵌入式系统以及各自的功能、硬件架构、操作系统、软件架构
android·linux·算法·ubuntu·机器人·硬件架构
郝学胜-神的一滴11 小时前
主成分分析(PCA)在计算机图形学中的深入解析与应用
开发语言·人工智能·算法·机器学习·1024程序员节