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

暂无。。。

相关推荐
leo__5201 分钟前
基于A星算法的MATLAB路径规划实现
人工智能·算法·matlab
程序员-King.10 分钟前
day152—回溯—电话号码的字母组合(LeetCode-17)
算法·leetcode·深度优先·递归
wm104312 分钟前
代码随想录 第六天
数据结构·算法
I Promise3414 分钟前
计算机常用算法在工程中的全面应用
算法
LDG_AGI17 分钟前
【机器学习】深度学习推荐系统(三十):X 推荐算法Phoenix rerank机制
人工智能·分布式·深度学习·算法·机器学习·推荐算法
皮蛋sol周22 分钟前
嵌入式学习数据结构(三)栈 链式 循环队列
arm开发·数据结构·学习·算法··循环队列·链式队列
devnullcoffee27 分钟前
2026年Amazon Listing优化完全指南:COSMO算法与Rufus AI技术解析
人工智能·python·算法·亚马逊运营·amazon listing·cosmo算法·rufus ai技术
苦藤新鸡41 分钟前
19.旋转输出矩阵
c++·算法·leetcode·力扣
zsffuture42 分钟前
RKNN 8位量化全解析:算法差异与粒度选择实战指南
算法
玄冥剑尊42 分钟前
贪心算法深化 II
算法·贪心算法