当前位置: 首页 > news >正文

0-1BFS(双端队列,洛谷P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)题解)

对于权重为0或1的路径搜索中,使用双端队列可以对最短路问题进行时间复杂度的优化,由于优先队列的O(longn)级别的插入时间,对于双端队列O(1)插入可以将时间复杂度减少至O(M);

https://www.luogu.com.cn/problem/P4667

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
bool tin=0;
char ma[505][505];// 存图 
int vis[505][505],se[505][505];//vis记录步数,se记录是否出过一次队列 
deque <array<int,2>> dq;//双端队列记录点 
int dx[]={-1,-1,1,1},dy[]={-1,1,1,-1},ex[]={-1,-1,0,0},ey[]={-1,0,0,-1};
//dx,dy为下一个点的位移量,ex,ey为对应格子的位移 
string s="\\/\\/";//正确连接的状态,符合该状态即无需旋转 
void solve()
{int n,m;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>ma[i][j];//输入图 }}for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){vis[i][j]=INT_MAX;se[i][j]=0;//重置位置以及步数数组 }}dq.push_back({0,0});vis[0][0]=0;//存入起点 while(!dq.empty()){int x=dq.front()[0],y=dq.front()[1];dq.pop_front();//取头点 if(se[x][y])continue;se[x][y]=1;//来过不再进行 for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i],exx=x+ex[i],eyy=y+ey[i];//算出下一个点以及两点间对应的连接情况 if(xx<0||xx>n||yy<0||yy>m)	continue;//越界 int d=vis[x][y]+(ma[exx][eyy]!=s[i]);//距离 if(d<vis[xx][yy])//更优距离就更新 {vis[xx][yy]=d;if(ma[exx][eyy]==s[i]){dq.push_front({xx,yy});//是正确连接放在头部 }elsedq.push_back({xx,yy});//否则放在尾部 }}	}if(vis[n][m]==INT_MAX)cout<<"NO SOLUTION";elsecout<<vis[n][m];
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int T=1;if(tin)cin>>T;while(T--){solve();}return 0;
}

http://www.lryc.cn/news/601399.html

相关文章:

  • 【C++】论如何封装红黑树模拟实现set和map
  • Java全栈面试实战:从JVM到AI的技术演进之路
  • JavaScript手录07-数组
  • LangChain实现RAG
  • JavaSE-String类
  • Rust赋能智能土木工程革新
  • 【奔跑吧!Linux 内核(第二版)】第5章:内核模块
  • 栈----4.每日温度
  • 2.qt调试日志输出
  • 多智能体系统设计:协作、竞争与涌现行为
  • Day4.AndroidAudio初始化
  • bash的特性-常用的通配符
  • bash的特性-命令和文件自动补全
  • C++ 多线程(一)
  • 第六章 JavaScript 互操(2).NET调用JS
  • ios UIAppearance 协议
  • 「iOS」————消息传递和消息转发
  • 携带参数的表单文件上传 axios, SpringBoot
  • 深度解读Go 变量指针
  • [每周一更]-(第152期):Go中的CAS(Compare-And-Swap)锁原理详解
  • iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术
  • 结合Golang语言说明对多线程编程以及 select/epoll等网络模型的使用
  • goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
  • 学习Python中Selenium模块的基本用法(1:简介)
  • Day06–哈希表–242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
  • 仓库管理系统-2-后端之基于继承基类的方式实现增删改查
  • 7.25 C/C++蓝桥杯 |排序算法【下】
  • macOS 安装 Homebrew
  • JavaScript事件(event)对象方法与属性
  • mac配置多版本jdk