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

暂无。。。

相关推荐
智驱力人工智能4 分钟前
货车走快车道检测 高速公路安全治理的工程实践与价值闭环 高速公路货车占用小客车道抓拍系统 城市快速路货车违规占道AI识别
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
喵手14 分钟前
Python爬虫实战:电商实体消歧完整实战 - 从混乱店铺名到标准化知识库的工程化实现,一文带你搞定!
爬虫·python·算法·爬虫实战·零基础python爬虫教学·同名实体消除·从混乱店铺名到标准化知识库
weixin_4521595518 分钟前
C++与Java性能对比
开发语言·c++·算法
80530单词突击赢18 分钟前
C++哈希表实现:开散列与闭散列详解
算法·哈希算法·散列表
Timmylyx051821 分钟前
类欧几里得学习笔记
笔记·学习·算法
wangluoqi24 分钟前
26.2.2练习总结
算法
2301_7657031425 分钟前
C++中的工厂模式实战
开发语言·c++·算法
星火开发设计1 小时前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
We་ct1 小时前
LeetCode 289. 生命游戏:题解+优化,从基础到原地最优
前端·算法·leetcode·矩阵·typescript
自己的九又四分之三站台1 小时前
9:MemNet记忆层使用,实现大模型对话上下文记忆
人工智能·算法·机器学习