当前位置: 首页 > 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.dtcms.com/a/287745.html

相关文章:

  • Map集合
  • 以太坊的心脏与大脑:详解执行客户端(EL)与共识客户端(CL)
  • NW993NX584美光固态闪存NX559NX561
  • Java 中的函数式编程详解
  • PHP框架在大规模分布式系统的适用性如何?
  • Python构建AI数独求解器:从回溯算法到深度学习
  • 网络基础DAY13-NAT技术
  • (后者可以节约内存/GPU显存)Pytorch中求逆torch.inverse和解线性方程组torch.linalg.solve有什么关系
  • [FFmpeg] AVFormatContext、AVInputFormat、AVOutputFormat | libavformat
  • SQLShift:一款异构数据库存储过程迁移工具
  • 网络大提速,RDMA,IB,iWrap
  • 数据库第三次和第四次作业
  • 异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql
  • 计算机网络体系结构
  • 【Java源码阅读系列56】深度解读Java Constructor 类源码
  • 物联网系统中-设备管理定义方法
  • 物联网iot、mqtt协议与华为云平台的综合实践(万字0基础保姆级教程)
  • Hyperliquid:探索去中心化衍生品交易的“速度与激情”
  • C++ 内存管理详解(new,delete)
  • 1. Spring AI概述
  • 暑假训练七
  • 在非Spring Boot的Spring项目中使用Lock4j
  • 让 Windows 用上 macOS 的系统下载与保姆级使用教程
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sqlalchemy’问题
  • 力扣经典算法篇-26-长度最小的子数组(暴力求解法,左右指针法)
  • ARINC818协议综述
  • Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等
  • 多式联运物流管理系统的设计与实现(原创)
  • JavaScript中的位运算符:深入理解<<和>>>
  • OpenCV 官翻 3 - 特征检测 Feature Detection