BFS(广度优先搜索)记忆搜索(三)

Petalinux 2021.2 下 Qt组件编译报错?手把手教你修改bb文件搞定qt3d/qtquickcontrols2 本文详细解析了Petalinux 2021.2环境下Qt组件(如qt3d、qtquickcontrols2)编译报错的解决方案。通过修改bb文件或使用bbappend文件覆盖,有效解决`petalinux-build --sdk`命令执行时的源码获取失败或哈希校验不匹配问题,并提供验证与调试技巧,帮助开发者快速修复构建流程中断问题。 阅读详情

  一提到BFS的时候大家一般都会申请一个数组vis,vis的作用是用来标记有没有搜索过,如果搜索过那么vis = 1,如果没有搜索过那么vis = 0,在每一次搜索的时候都会重新初始化vis, 把vis初始化为0,如果查询的次数比较多,那么就白白浪费了很多时间,很多的操作其实都是重复的,所以这篇博客讲述BFS+记忆搜索。

  大家在做BFS题的时候有没有意识到其实BFS在搜索的时候只是搜索连通的某块,就比如说你在一个荒岛上,其他人在另外一个岛上,你和其他人也没有办法取得联系,所以BFS的搜索也是一个道题,BFS模块搜索的其实只是互相连通模块,如果不互相连通那么这些模块其实没有任何关系,也就是不能相互到达。所以在记忆化搜索时vis就不用每次初始化,一次就行,vis用来记录可以相互到达的模块。在每次查询的时候只要先询问是否被分配到一个模块中,如果没有在就用BFS查询,如果有直接就知道这个模块的中几个点可以相互到达。

01迷宫     洛谷     P1141

连接:https://www.luogu.org/problemnew/show/P1141

题意:有一个仅由数字00与11组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上。你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

题解:题意很简单,但是查询的次数比较多,如果只用最普通的查询那么这道题会直接TLE的,一开始我就直接普通的BFS算法,但是只通过了70%,其中有三个直接TLE,有三个点的数据太大,不适合直接查询,所以需要BFS+记忆化,只要某些点在同一个某块中这些点就可以相互到达。

这个是一开始大代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define N 1005
struct Node{
       int x, y;
       char pre;
}tmp1, tmp2;
char a[N][N];
int n, step;
int dx[8]={1,-1,0,0};
int dy[8]={0,0,1,-1,};
int vis[N][N];
void bfs(int st, int en){
     memset(vis, 0, sizeof(vis));
     step = 0;
     tmp1.x = st;
     tmp1.y = en;
     vis[st][en]= 1;
     tmp1.pre = a[st][en];
     queue<Node>q;
     q.push(tmp1);
     while(!q.empty()){
        tmp1 = q.front();
        q.pop();
        //cout<<tmp1.x<<" "<<tmp1.y<<endl;
        for(int i = 0; i < 8; i++){
            tmp2.x = tmp1.x + dx[i];
            tmp2.y = tmp1.y + dy[i];
            if(tmp2.x >= 0 && tmp2.x<n && tmp2.y>= 0&&tmp2.y < n && !vis[tmp2.x][tmp2.y]&& a[tmp2.x][tmp2.y]!=tmp1.pre){
                vis[tmp2.x][tmp2.y] = 1;
                tmp2.pre = a[tmp2.x][tmp2.y];
                q.push(tmp2);
                step++;
            }
        }
     }
}
int main(){
    int m, st, en;
    cin>>n>>m;
    for(int i = 0; i < n; i++){
        scanf("%s", a[i]);
    }
    while(m--){
        cin>>st>>en;
        bfs(st-1, en-1);
        cout<<step+1<<endl;
    }
return 0;
}

这个是AC代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define N 1005
#define maxn 1000005
struct Node
{
    int x, y;
    char pre;
} tmp1, tmp2;
char a[N][N];
int n, num = 0;
int dx[8]= {1,-1,0,0};
int dy[8]= {0,0,1,-1,};
int vis[N][N];
int ans[maxn];
int bfs(int st, int en)
{
    num++;
    int step = 1;
    tmp1.x = st;
    tmp1.y = en;
    vis[st][en]= num;
    tmp1.pre = a[st][en];
    queue<Node>q;
    q.push(tmp1);
    while(!q.empty())
    {
        tmp1 = q.front();
        q.pop();
        for(int i = 0; i < 8; i++)
        {
            tmp2.x = tmp1.x + dx[i];
            tmp2.y = tmp1.y + dy[i];
            if(tmp2.x >= 0 && tmp2.x<n && tmp2.y>= 0&&tmp2.y < n && !vis[tmp2.x][tmp2.y]&& a[tmp2.x][tmp2.y]!=tmp1.pre)
            {
                vis[tmp2.x][tmp2.y] = num;
                tmp2.pre = a[tmp2.x][tmp2.y];
                q.push(tmp2);
                step++;
            }
        }
    }
    ans[num] = step;
    return step;
}
int main()
{
    int m, st, en;
    cin>>n>>m;
    for(int i = 0; i < n; i++)
    {
        scanf("%s", a[i]);
    }
    while(m--)
    {
        cin>>st>>en;
        if(!vis[st-1][en-1])//查询是否在一个模块中
            cout<<bfs(st-1, en-1)<<endl;
        else cout<<ans[vis[st-1][en-1]]<<endl;
    }
    return 0;
}

 

库存优化技术提升电商效率 第一部分:库存优化技术基础 第1章:库存优化的基本概念 库存优化是现代电商运营中至关重要的一个环节。简单来说,库存优化指的是通过一系列的策略和技术手段,使得库存管理更加高效、准确,从而降低运营成本,提高销售额。 1.1 库存优化的定义与重要性 阅读详情

相关推荐

Linux内存优化:KSM技术原理与实践指南

内存共享是提升虚拟化环境资源利用率的关键技术,其核心原理是通过识别相同内容的内存页进行合并。Linux内核的KSM(Kernel Samepage Merging)机制采用红黑树数据结构管理内存页,通过多级哈希比较算法实现高效合并。该技术能显著降低物理内存消耗,提升CPU缓存命中率,特别适用于运行大量相似虚拟机实例的场景。在容器化和云计算环境中,KSM与NUMA优化、内存气球等技术协同,可实现40%-60%的内存节省。典型应用包括金融云平台的高密度虚拟机部署,以及Kubernetes集群的基础镜像优化。

weixin_28730353的博客 369

leetcode:847. 访问所有节点的最短路径【bfs + 记忆化seen】

开始遍历的时候都可以为起点记忆化(now, mask)当mask第一次满了之后,就是最短的路径(注意,要记录一下当前的最短路径)

小楼一夜听春雨 510

An工具介绍之摄像头

An工具介绍之摄像头

人生得意须尽欢 6185

LeetCode 279 完全平方数(BFS + 记忆化搜索)解法

题意说明 给定正整数n,找到若干个完全平方数(比如:1,4,9,16,……)使得它们的和等于n。找出组成和的完全平方数的最小个数。‘ 思路 看到最XXX,第一反应一般是动态规划或贪心。不过这一题贪心不能采取不断选取范围内的最大完全平方数的策略。比如:12 = 4 + 4 + 4为最优解,但是若采取如上所示的贪心策略,则:12 = 9 + 1 + 1 + 1并不是最优解。 此题也可以采取广度优先搜索BFS的方式进行求解,大致思路如下: 设置ans = 0,max = Math.sqrt(n)来限制完全平方

qq_42386550的博客 728

ChromeOS安装教程

ChromeOS,是基于Linux内核研发的ChromiumOS开源系统的闭源系统,最大的特色就是内置了Chrome浏览器,早期主要以Web云端应用程序为主,后来逐渐引入了Android子系统和Linux子系统。本文主要简述摸索的家用笔记本安装ChromeOS安装方法,供各位玩机朋友参考。

weixin_45751495的博客 8109

Contest 226 - C - Martial artist

from atcoder Problem Statement Time Limit: 2 sec / Memory Limit: 1024 MB Score :300300points Takahashi is a martial artist. There areNNmoves that a martial artist can learn, called Move11,22,\ldots…,NN. For each1 \leq i \leq N1≤i≤N, it takes...

m0_54674275的博客 1020

数据结构之bfs与dfs(记忆化搜索)

bfs-nowcoder F-maze 小明来到一个由n x m个格子组成的迷宫,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱。小明所在的位置用'S'表示,目的地用'T'表示。 小明只能向上下左右相邻的格子移动,每移动一次花费1秒。 有q个单向传送阵,每个传送阵各有一个入口和一个出口,入口和出口都在迷宫的格子里,当走到或被传送到一个有传送阵入口的格子时,小明可以选择...

代码行 552

lp–mspm0g3507开发板进入低功耗模式怎么退出?烧程序烧着烧着就进来了,跳线帽没动过,且报错:Texas Instruments Debugger Error: DAP Co...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1568

BFS + 路径记忆

19蓝桥杯省赛 迷宫 题目描述:给定一个30行50列的迷宫,从左上角移动到右下角,并输出移动路径。 移动有四种方式“U,D,L,R”,分别表示往上下左右走。‘0’表示可以走,‘1’代表墙不能走。 解题思路:其实参加比赛的时候根本就不会,只学了个语言基础,连bfs都不会,赛后听学长说是bfs,后来学了bfs,还是不知道怎么解决输出路径的问题。过了好久才知道,只需要维护一个队首head和队尾tail指...

qq_43461168的博客 2138

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

Claude Code 任务编排 头脑风暴与 疯狂拷问:Superpowers vs Grill-me 硬核对比与工程落地

Superpowers和Grill-me是AI编程中的互补工具:Superpowers提供工程化开发流程(从需求梳理到代码审查),确保规范执行;Grill-me通过持续追问帮助厘清需求,避免方向偏差。两者结合形成"构思-拷问-执行"工作流,前者负责方案生成与落地,后者专注需求审查。根据场景选择:个人项目可用Grill-me快速澄清需求,企业项目推荐Superpowers全流程,复杂开发则建议组合使用。它们分别解决"如何落地"和"是否对齐"的问题,共

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 324

算法总结(12)--dfs, bfs记忆化, 减少不必要的搜索

题目地址https://leetcode.com/problems/longest-increasing-path-in-a-matrix/题目描述Given an integer matrix, find the length of the longest increasing path.From each cell, you can either move to four directions:

master-dragon的专栏 2691

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created..

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2773

章节三:图上涟漪:BFS层层推进解迷宫 - (广度优先搜索 / BFS)

本文介绍了广度优先搜索(BFS)算法的核心概念与应用。通过迷宫探险的生动比喻,阐述了BFS如何利用队列实现层级扩散搜索,确保找到无权图中的最短路径。文章详细解析了BFS的工作原理、时间复杂度(O(V+E))和空间复杂度(O(V)),并通过流程图直观展示搜索过程。最后提供了Java和Python的代码实现示例,展示如何使用邻接表完成BFS遍历。该算法适用于社交网络分析、路径规划等多种场景,是图论中最基础且重要的遍历方法之一。

杨小扩的博客 759

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

BFS(三):双向广度优先搜索

所谓双向广度搜索指的是搜索沿两个方向同时进行:(1)正向搜索:从初始结点向目标结点方向搜索;(2)逆向搜索:从目标结点向初始结点方向搜索;当两个方向的搜索生成同一子结点时终止此搜索过程。 广度双向搜索通常有两种方法:(1)两个方向交替扩展;(2)选择结点个数较少的那个方向先扩展。方法(2)克服了两方向结点的生成速度不平衡的状态,可明显提高效率。 【例1】Knight M...

weixin_30735745的博客 482

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

三、【图算法】广度优先搜索(BFS)

图算法是个庞大的家族,其中大部分成员的主体框架都可以归结于图的遍历。图的遍历需要访问所有顶点一次且仅 一次,此外,图遍历同时还要访问所有的边一次且仅一次。经过一次遍历,树边的顶点共同构成了原图的一颗遍历树。 为防止对顶点的重复访问,在遍历的过程中,需要动态地设置各顶点的不同状态,并且随着遍历的进程不断地转换状态,直至最后的“访问完毕”,图的遍历更加强调对处于特定状态顶顶啊的甄别和查找,故也称作图...

天涯明月刀的博客 460

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

GESP6级C++考试语法知识(二十八、广度优先搜索(三、层级 BFS))

GESP6级C++考试语法知识(二十八、广度优先搜索(三、层级 BFS))

汉克老师的博客 463

nyoj21 三个水杯 (BFS)

题目21题目信息运行结果本题排行讨论区 三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。 输入第一行一个整数N(0 接下来每组

苏苏爱自由 3762

三个水杯-简单bfs

给你三个水杯的容量,只有第一杯里面装满水,其他两个水杯是空的,再输入三个目标值,问你是否能通过倒水达到这个目标,如果能,输入最少步数,如果不能,输出-1. 这题其实就是一个简单的BFS,以前感觉太麻烦了,一直不想写,今天终于AC了它。最后提示一下,BFS还是加上标记比较好。 #include #include #include #include #include using namespac

SSimpLe_Y的博客 559

nyoj 21-三个水杯(BFS)

21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 ...

devon2014的博客 113

三个水杯 搜索题 bfs

思路:abc三个水杯 一共有六种倒水方式。a-b,a-c ; b-a,b-c;c-d;广搜着6种方式即可。但是得判断杯子里的水放进另外一个杯子放不放的下,另外一个杯子需要多少水,杯子子里有没有水可放。不要忘记目标和初始状态一样那种情况。 三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述给出三个水杯,大小不一,并且只有最大

旺旺的博客 1635

NYOJ21 三个水杯 【BFS】

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。 输入第一行一个整数N(0 接下来每组测试数据有两行,第一行给出三

长风的专栏 1780

【Leetcode】一文搞懂 BFS (广度优先搜索) —— 附“奇怪的电梯”题解

本文系统讲解了广度优先搜索(BFS)算法的核心思想与应用场景。BFS以"波纹扩散"的方式按层级遍历图结构,确保首次到达目标节点的路径即为最短路径。文章详细介绍了BFS的三个核心组件:队列(控制遍历顺序)、访问标记数组(防止重复访问)和步数记录器,并提供了标准Java实现模板。通过分析"奇怪的电梯"问题,展示了如何将实际问题建模为无权图的最短路径问题,并给出完整的BFS解决方案。文章强调BFS适用于求"最少操作次数"类问题,是解决无权图最短路径问题的标准算法。

一个coder的博客 4724

BFS算法学习

广度优先搜索(BFS)使用队列实现逐层遍历,确保在无权图中找到最短路径。其核心是队列操作与访问标记,空间复杂度较高。适用于层次遍历、最短路径搜索、连通性判断和扩散模拟等问题。实现时需注意状态表示和边界处理,常用优化包括双向BFS。掌握队列与标记的配合是理解BFS的关键。

2301_79461785的博客 480

C++用BFS广度优先搜索解POJ_3669_Meteor Shower问题

POJ_3669_Meteor Shower 就不放题目了,去POJ搜题号就可以看到 简单理解一下题目: 张三遇到了流星雨,

只想AC的博客 277

【Python算法实战】广度优先搜索(BFS)核心原理与三大工程级应用场景剖析

本文深入解析了广度优先搜索(BFS)的核心原理及其在Python中的实现,重点探讨了BFS在复杂网络最短路径规划、状态空间搜索与最优解验证、多源BFS与扩散模拟三大工程级应用场景。通过实际代码示例和对比分析,帮助开发者掌握BFS算法在物流配送、游戏AI寻路、拼图游戏解法等领域的实战应用。

weixin_34166472的博客 448
上一篇: BFS(广度优先搜索)简单例题(二)
下一篇: 字典树(Trie)
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值