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

暂无。。。

相关推荐
girl-07261 小时前
2025.12.28代码分析总结
算法
NAGNIP3 小时前
GPT-5.1 发布:更聪明,也更有温度的 AI
人工智能·算法
NAGNIP3 小时前
激活函数有什么用?有哪些常用的激活函数?
人工智能·算法
元亓亓亓4 小时前
LeetCode热题100--416. 分割等和子集--中等
算法·leetcode·职场和发展
BanyeBirth4 小时前
C++差分数组(二维)
开发语言·c++·算法
xu_yule6 小时前
算法基础(数论)—算法基本定理
c++·算法·算数基本定理
CoderCodingNo6 小时前
【GESP】C++五级真题(结构体排序考点) luogu-B3968 [GESP202403 五级] 成绩排序
开发语言·c++·算法
YGGP8 小时前
【Golang】LeetCode 32. 最长有效括号
算法·leetcode
自然常数e8 小时前
字符函数和字符串函数
c语言·算法·visual studio