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

算法题(175):小明的游戏

审题:

本题需要我们找到从起点到终点所需的最短距离并输出(多组输入输出)

思路:
方法一:01BFS

由于本题的目的是找最短路径,所以我们可以采用bfs来进行搜索,而路径权值并非都为1,而是有0有1.故我们采用01BFS

补充:

普通BFS:路径权值都为1,直接按轮次搜索即可

能成功的本质:权值为1,dis数组的值都是非递减的,所以每一个位置第一次到达的距离一定是到他的最短距离

01BFS:路径权值为1或0,需要对数据顺序进行排序,还要进行松弛操作将最优距离计入

解题:

#include<iostream> #include<deque> #include<cstring> using namespace std; typedef pair<int, int> PII; const int N = 510; int n, m, x1, x2, y1, y2; char a[N][N];//字符数组 int dis[N][N];//距离数组 int dx[] = { 1,-1,0,0 }; int dy[] = { 0,0,1,-1 }; void bfs()//01bfs { if (x1 == x2 && y1 == y2) { dis[x2][y2] = 0; return; } //痕迹清除 deque<PII> q; memset(dis, -1, sizeof(dis)); q.push_front({ x1,y1 }); dis[x1][y1] = 0; //循环搜索路径 while (q.size()) { PII t = q.front(); q.pop_front(); int x0 = t.first; int y0 = t.second; if (x0 == x2 && y0 == y2) { return; } for (int i = 0; i < 4; i++) { int x = x0 + dx[i]; int y = y0 + dy[i]; if (x >= 0 && x < n && y >= 0 && y < m) { char cur = a[x0][y0], next = a[x][y]; int w = (cur == next ? 0 : 1); if (dis[x][y] == -1)//第一次遇到 { dis[x][y] = dis[x0][y0] + w; if (w == 0) { q.push_front({ x,y }); } else { q.push_back({ x,y }); } } else if (dis[x0][y0] + w < dis[x][y])//遇到更优情况 { dis[x][y] = dis[x0][y0] + w; } } } } } int main() { //数据录入 while (cin >> n >> m, n && m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } cin >> x1 >> y1 >> x2 >> y2; bfs(); cout << dis[x2][y2] << endl; } return 0; }

注意:

bfs总体逻辑:先清除痕迹,然后使用双端队列将起点坐标录入,进入bfs搜索。

在确保坐标合法的前提下,判断该坐标是否是第一次遇到,或者该坐标是否可以用更短的距离到达。

1.数据录入的时候使用了逗号表达式,其含义是在n与m不全为0的情况下进行循环数据录入

2.第一次遇到时,若该路径的权值为0,则需要将该坐标的点头插进入双端队列,因为他属于当前轮次搜索的点,否则就尾插即可

3.遇到更优情况:更新dis为最优情况

P4554 小明的游戏 - 洛谷

http://www.jsqmd.com/news/803948/

相关文章:

  • Gemini-CLI-UI:为AI命令行工具打造图形化集成开发界面
  • CashClaw:轻量级命令行钱包,赋能区块链开发自动化
  • 3分钟告别龟速下载:BitTorrent公共Tracker终极优化秘籍
  • NomNom终极指南:3个技巧让你轻松掌控《无人深空》存档
  • GitHub 代码提交常见问题及解决指南
  • 从“意大利面”到整洁代码:我是如何用SonarQube重构遗留项目的
  • 强力开源工具:Revit模型双格式导出解决方案
  • 规划后的轨迹,如何发给 moveit_servo 执行
  • ComfyUI-WanVideoWrapper终极指南:5分钟掌握AI视频动画制作
  • 如何快速自定义hexo-theme-tranquilpeak主题样式:SCSS变量与组件定制终极指南
  • 2026年餐饮收银系统服务商专业推荐:餐饮商家数字化落地选型参考指南 - 产业观察网
  • 对比直接使用官方api体验Taotoken聚合服务的优势
  • 还在为Zotero中文文献管理烦恼?Jasminum插件三招解决你的所有痛点!
  • 终极指南:如何使用Azure Quickstart Templates实现成本管理与预算警报
  • 软银携手DeltaX建储能基地,2027年量产应对AI算力电力挑战
  • 终极Photoshop图层批量导出指南:10倍速解放设计师双手
  • Django 连接 MySQL 报 OperationalError 2003 错误怎么处理?
  • 2026年AI大模型发展正当时,这些优质AI大模型接口加速站值得开发者重点关注!
  • Windows上快速安装APK文件的终极指南:APK Installer完整使用教程
  • Cursor Pro免费解锁终极指南:如何快速突破AI编辑器限制
  • 财务自动化流水线 | iPaaS串接银企直连、费控、ERP的最佳实践
  • 三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南
  • 正点原子 STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战
  • Spinach印相失效全归因,深度解析--style raw失效、seed锁定崩溃及CMYK模拟断层的底层渲染链路
  • 从零开始观测你在Taotoken上的大模型API消费明细
  • 厚街游泳培训哪家值得推荐:秒杀游泳培训绝绝子 - 17322238651
  • 2026年上海留学比较好的中介,学员满意度高成关键参考 - 速递信息
  • Simplefolio缓存策略终极指南:提升开发者个人网站加载速度的完整方案
  • 终极指南:EdgeDB内置迁移系统实现零停机数据库演进的完整方案
  • 在 Hermes Agent 项目中自定义提供商并接入聚合 API 服务