首页 > 其他分享 >二维 bfs 基础笔记

二维 bfs 基础笔记

时间:2024-10-18 08:49:22浏览次数:1  
标签:nx int 笔记 bfs ny 二维 mp 1005

一、寻找连通块

1. 基本思路

找到一个未被走过的点,以这个点为起点,将与此点相连的所有点标记为走过,答案数 \(+1\)

2. 代码实现

#include <bits/stdc++.h>
using namespace std;
struct p{
    int x, y;
};
queue<p> q;
int n, m, cnt;//最终答案为cnt
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};//方向数组
char mp[1005][1005];//原矩阵
bool f[1005][1005];//标记数组
void bfs(){
    while(!q.empty()){
        int mx = q.front().x, my = q.front().y;
        q.pop();
        for(int i = 0; i <= 3; i++){
            int nx = mx + dx[i], ny = my + dy[i];
            if(nx < 1 || ny < 1 || nx > n || ny > m) continue;
            if(mp[nx][ny] =='0') continue;
            mp[nx][ny] = '0';//标记此点走过
            q.push({nx, ny});
        }
    }
}
int main(){
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> mp[i][j];
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(mp[i][j] != '0'){//未被标记过
                cnt++;//答案数+1
                q.push({i, j});//以此点为起点
                bfs();
            }
        }
    }
    cout << cnt;
    return 0;
}

例题:

P1451 求细胞数量

P6757 [BalticOI2013] Tracks in the Snow 雪中足迹


二、经典 bfs 最短路问题

1. 基本思路

以某一格为起点,每步可以向上、下、左、右四个方向走一格,输出到达终点的最少步数。

2. 代码实现

#include <bits/stdc++.h>
using namespace std;
struct p{
    int x, y;
};
int n, m, sx, sy, ex, ey, step[1005][1005];
bool mp[1005][1005], f[1005][1005];
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
// step[i][j]:到达(i,j)的步数
// f[i][j]:(i,j)是否走过
// dx[]/dy[]:方向数组
void bfs(){
    queue<p> q;
    q.push({sx, sy});
    while(!q.empty()){
        int mx = q.front().x, my = q.front().y;
        q.pop();
        if(mx == ex && my == ey){// 到终点
            cout << step[mx][my];
            return;
        }
        for(int i = 0; i <= 3; i++){
            int nx = mx + dx[i], ny = my + dy[i];
            if(nx > n || nx < 1 || ny > m || ny < 1) continue;// 越界的
            if(f[nx][ny] || mp[nx][ny]) continue;//走过的/不能走的
            f[nx][ny] = 1;// 标记
            step[nx][ny] = step[mx][my] + 1;// 步数
            q.push({nx, ny});
        }
    }
}
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> mp[i][j];
    cin >> sx >> sy >> ex >> ey;
    bfs();
    return 0;
}

例题:

P1746 离开中山路

B3625 迷宫寻路


3.01bfs

AT_abc176_d [ABC176D] Wizard in Maze

经典的 01bfs 问题。是的你没看错就是之前总结的题(

移步 我的文章


4. 变形(?)

P1141 01迷宫

P1443 马的遍历

P1332 血色先锋队

标签:nx,int,笔记,bfs,ny,二维,mp,1005
From: https://www.cnblogs.com/KukCair/p/18473424

相关文章

  • 《使用Gin框架构建分布式应用》阅读笔记:p77-p87
    《用Gin框架构建分布式应用》学习第5天,p77-p87总结,总计11页。一、技术总结1.Go知识点(1)context2.on-premisessoftwarep80,AcontainerislikeaseparateOS,butnotvirtualized;itonlycontainsthedependenciesneededforthatoneapplication,whichmakesthe......
  • 二维数组的简单用法
    publicclassIntArrayDemo{publicstaticvoidPrint(){for(inti=0;i<IntArray.Ints.Length;i++){Console.WriteLine(i);}}publicstaticvoidGetValue(......
  • (八千字心得笔记)零基础C语言入门第一课——初识C语言
    这一课主要是让大家初步了解C语言,了解我们的开发环境,main函数,库函数,关键字,字符和字符串等内容的介绍,后面会一一讲解文章目录一.C语言是什么1.1C语言的历史二.开发环境编译型语言和解释型语言2.1编译和链接2.2编译器的选择2.2.1VS项目和源文件、头文件介绍2.2.2......
  • CSS笔记—盒子定位之固定定位(重难点!!小白刚需)
    1、固定定位的概念        固定定位(fixed)的元素位置相对于浏览器窗口进行定位(会脱离文档流),即使页面滚动,固定定位元素不会随滚动条滚动,除非改变浏览器窗口的位置或大小‌ 2、语法格式: <head>        选择器{position:fixed;}</head>水平位置:left定......
  • 吴恩达深度学习笔记(4)---加速神经网络训练速度的优化算法
    机器学习的应用是一个高度依赖经验,不断重复的过程,需要训练很多模型才能找到一个确实好用的。小批量梯度下降算法:矢量化可以有效计算m个算例而不需要for循环,因此我们需要将所有的训练样例放入巨型矩阵中。但是当数据量超大时,计算时间仍需很久,可以考虑将训练集分为微小的训练集......
  • 树链剖分笔记
    题单传送门2024.10.12P3038GrassPlantingG:DevC++栈空间开小了;调了三天啊三天线段树区间修改写成区间单点修改了;树剖往上跳写成了dep[u]<dep[v]而不是dep[top[u]]<dep[top[v]]2024.10.15P3128MaxFlowP:奇怪的TLE树剖DFS没把子树大小加到根上,重链剖分写成了后......
  • LCA学习笔记
    LCA学习笔记定义:在一棵树中,两个节点的最近公共祖先。1.暴力求法处理出每个点的深度,先把深度较深的一个点沿着父节点方向一直走到与另一个点相同的深度,如果此时两个点不同,那么两个点一起向上跳(代码实现过于简单,这里不过多赘述)2.倍增优化暴力注意到我们在暴力求法中,点是一步一......
  • 从单细胞和空间转录组学推断模式驱动的细胞间流动(Flowsig)--生信算法笔记
    **Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics**Almet,A.A.,Tsai,YC.,Watanabe,M.etal.Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics.NatMethods21,1806......
  • 2024年软件设计师中级(软考中级)详细笔记【6】结构化开发方法(分值3~4)
    目录前言6.1系统分析与设计概述6.1.2系统设计的基本原理6.1.3系统总体结构设计6.1.4系统文档6.2.2数据流图6.2.3数据字典(DD)6.5用户界面设计6.5.1用户界面设计的黄金原则杂题习题:结语前言在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的......
  • 小白怎么入门CTF,看这个就够了(附学习笔记、靶场、工具包下载)
     CTF靶场:CTF刷题,在校生备战CTF比赛,信安入门、提升自己、丰富简历之必备(一场比赛打出好成绩,可以让你轻松进大厂,如近期的各种CTF杯),在职人员可以工作意外提升信安全技能。渗透实战靶场:挖洞、渗透实战(web、域、横向渗透),适合实战能力需要大幅度提升的同学。一、CTF入门最近很多......