一次可连续走k步的bfs的处理方法

news/2026/1/25 17:04:59/文章来源:https://www.cnblogs.com/jjjxs/p/19530086

做在二维地图上移动的模拟题时,绝大多数情况都需要使用 \(bfs\),其中 \(99\%\) 的情况都是只走一步(也就是上下左右四个方向选一个,并移动一格)。那么如果每一次可以连续走 \(k\) 步,我们应当如何处理呢?

M - Nightmare Ⅱ

重点看 bfs 函数部分,将 \(while\) 函数的退出条件改成了计数器减为 0。这样就可以做到在 bfs 的每一步转移时,用到的都是上一次走了相同步数的点。

本题也是练习双向 bfs 的好题。通过按照时间戳 cnt 同时模拟两个人的 bfs 过程,判断两个人是否可以相遇 当且仅当 两个人可以在某 cnt 时走到同一个点上。而与鬼魂的相遇直接简单地利用曼哈顿距离处理。

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct str
{int x,y;
}z[2],b,g;
int t,n,m,cnt;
int drt[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char mapp[801][801];
bool vis[2][801][801];
queue<str> que[2];
bool check(str t)
{bool flag=true;if(abs(t.x-z[0].x)+abs(t.y-z[0].y)<=2*cnt)//判断鬼是否已经到达某一点flag=false;else if(abs(t.x-z[1].x)+abs(t.y-z[1].y)<=2*cnt)flag=false;if(t.x<0||t.y<0||t.x>=n||t.y>=m)//判断即将要走的点是否在界外 flag=false;else if(mapp[t.x][t.y]=='X')flag=false;return flag; 
}
bool bfs(int x)
{int tot=que[x].size();//每次连续弹出、处理的点都是同一步的点str now,nxt;while(tot--) // !!! 精妙之处,固定弹出队列元素的数量。设当前是在模拟走连续k步中的第j步,则弹出的点一定是恰好走了j-1步的所有点。等到处理完这些点后,队列内存留的是所有恰好走了j步的点,形成递推关系。{now=que[x].front();que[x].pop();if(!check(now))//判断鬼是否已经到达now所在的点continue;for(int i=0;i<4;i++){nxt.x=now.x+drt[i][0];nxt.y=now.y+drt[i][1];if(check(nxt)&&!vis[x][nxt.x][nxt.y])//判断nxt所在的点是否出界、是否已经过{vis[x][nxt.x][nxt.y]=true;if(vis[x][nxt.x][nxt.y]&&vis[1-x][nxt.x][nxt.y])//判断nxt所在的点是否被G和M都走过return true;que[x].push(nxt);}}}return false;
}
int fun()
{while(!que[0].empty())//每次处理一组新的数据前先将队列清空que[0].pop();while(!que[1].empty())que[1].pop();memset(vis,0,sizeof(vis));que[0].push(b);que[1].push(g);vis[0][b.x][b.y]=vis[1][g.x][g.y]=true;while(!que[0].empty()||!que[1].empty()){cnt++;//统计时间for(int i=0;i<3;i++)//M每个单位时间走三步if(bfs(0))return cnt;if(bfs(1))//G每个单位时间走一步return cnt;}return -1;
}
int main()
{scanf("%d",&t);while(t--){int zx=0;cnt=0;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%s",&mapp[i]);for(int j=0;j<m;j++){if(mapp[i][j]=='Z'){z[zx].x=i,z[zx].y=j;zx++;}if(mapp[i][j]=='M')b.x=i,b.y=j;if(mapp[i][j]=='G')g.x=i,g.y=j;}}printf("%d\n",fun());}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1215214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCI论文,能引用中文参考文献吗?

很多写SCI论文的同学经常会遇到一个问题&#xff1a;自己写的英文论文&#xff0c;不仅涉及到外文文献&#xff0c;同时也涉及到中文论文&#xff0c;是否可以引用中文参考文献呢&#xff1f; 答案是可以的。 但是在引用过程中也要注意以下几点: 第一、确认投递期刊是否可以…

Spring 6.0基于JDB手写定制自己的ROM框架

ORM 用面向对象的方式操作关系型数据库 开发者操作的是 对象&#xff08;Object&#xff09; ORM 框架负责把对象 自动映射 为&#xff1a; SQL 表&#xff08;Table&#xff09; 行&#xff08;Row&#xff09; 列&#xff08;Column&#xff09; 目标&#xff1a; 减…

一个英语听力的神器——获取transcripts

一个英语听力的神器——获取transcripts

基于SpringBoot完成的垃圾分类管理系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2026年国内评价高的调节阀厂家哪家强,半球阀/截止阀/闸阀/不锈钢阀门/电动盲板阀/消声止回阀,调节阀生产厂家排行榜

行业背景:调节阀市场进入技术驱动与场景深耕阶段 随着工业自动化进程加速,调节阀作为流程工业的核心控制设备,其性能直接影响生产效率与安全性。当前市场呈现两大趋势:一是智能化需求激增,电动/气动调节阀需集成远…

机器学习系列

3Blue1Brown深度学习视频 笔记 3Blue1Brown-深度学习之人工神经网络 3Blue1Brown-深度学习之梯度下降法

全方位谈判兵法——从底层逻辑到高手实战的20堂必修课

这是一篇基于刘碧荣教授20讲谈判课程录音整理、重构与润色的深度文章。文章剔除了口语赘述&#xff0c;修正了部分听录错误&#xff0c;并对核心知识体系进行了逻辑化的章节重组。 刘碧荣教授亲授&#xff1a;全方位谈判兵法——从底层逻辑到高手实战的20堂必修课 前言&#x…

个人职场顶层设计

导语&#xff1a; 经营企业需要顶层设计&#xff0c;个人职场发展同样如此。所谓的“顶层设计”&#xff0c;核心逻辑就是从后往前看——先把未来的路想清楚&#xff0c;再一步一步往前走。你是稀里糊涂地混日子&#xff0c;还是有预谋、有策略地规划人生&#xff1f;这决定了你…

通过阅读实现认知跃迁

你好&#xff01;我是你的内容策划专家。我已经对这份《高效阅读 - 成为一年阅读100本书的学习超人》的课程录音稿进行了深度整理和重构。 以下是为您提炼的专业文章&#xff0c;旨在保留大狗熊&#xff08;讲师&#xff09;的核心洞见&#xff0c;同时剔除冗余信息&#xff0…

人性皆有裂痕:理解人格的 52 堂心理学课

引言&#xff1a; “万物皆有裂痕&#xff0c;那是光照进来的地方。” 我们每个人身上都有一些特殊的行为模式和思维模式&#xff0c;也许你不喜欢&#xff0c;但那都是岁月的痕迹。了解自己&#xff0c;对于职业发展、两性关系和子女教育都大有裨益。心理学不仅是研究病症的科…

心理边界完全指南:如何在快节奏世界中找到高效与舒适

这是一篇基于《心理边界21讲》课程录音整理的精华文章。我已对原始内容进行了去粗取精、逻辑重组和专业润色&#xff0c;旨在为您呈现一套系统化的心理边界建立指南。 心理边界完全指南&#xff1a;如何在快节奏世界中找到高效与舒适 作者&#xff1a; 胡胜之 整理&#xff1a…

【计算机毕业设计案例】基于springboot的餐饮医院图书馆通用预约系统的设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

金华无尘车间改造优选,2026年洁净空间新体验,净化车间/净化工程/无尘室/无尘车间/恒温恒湿车间,无尘车间标准哪家好

在精密制造、生物医药、半导体等高技术领域,无尘车间是保障产品良率、提升工艺稳定性的核心基础设施。其洁净度、温湿度控制精度及环境稳定性直接影响企业生产效能与市场竞争力。本文聚焦金华地区万级无尘车间改造市场…

详细介绍:大型实时交易系统中基于事件驱动架构(EDA)构建高吞吐高可靠后端服务的工程实践与架构优化策略分享

详细介绍:大型实时交易系统中基于事件驱动架构(EDA)构建高吞吐高可靠后端服务的工程实践与架构优化策略分享2026-01-25 16:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wra…

Java毕设选题推荐:基于springboot+vue的通用预约系统的设计与实现基于Springboot校园实验室预约管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于springboot的各类型通用预约系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【毕业设计】基于springboot的通用预约系统的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java被裁后快速上岸指南!

上个月班上的好好的突然被通知"毕业了"&#xff0c;现在工作也确实不好找。之前近一个月面了很多大大小小的公司降薪太严重都没考虑去&#xff0c;最后没办法本来都打算随便去一家了却偶然得到一个阿里的面试机会&#xff0c;足足面了七面&#xff08;我太难了&#…

Java行情何时触底反弹?

很多人都说今年对于IT行业根本没有所谓的“金三银四”“金九银十”。在各大招聘网站或者软件上不管是大厂还是中小公司大多都是挂个招聘需求&#xff0c;实际并不招人。 虽然事实确实是如此&#xff0c;但你细心观察之后就会发现&#xff0c;圈子里那些平时注重提升自己核心竞…

Flutter + OpenHarmony 顶部导航栏:AppBar 与自定义标题、操作按钮的多设备适配

个人主页&#xff1a; 文章目录 前言一、AppBar 是什么&#xff1f;为什么它对 OpenHarmony 至关重要&#xff1f;1.1 AppBar 的定位与作用1.2 为何需关注 OpenHarmony 多设备适配&#xff1f; 二、AppBar 核心属性详解&#xff08;Dart 视角&#xff09;三、基础用法&#xff…