BFS专题5 跨步迷宫

题目:

样例1:

输入
3 3
0 1 0
0 0 0
0 1 0

输出
3

 样例2:

输入
3 3
0 1 0
0 1 0
0 1 0

输出
-1

思路:

        这里的跨步迷宫,我们可以将移动坐标扩大一倍,即加上 {2,-2,0,0 }的移动坐标即可,特别需要注意的是,我们得到某个坐标后对它 / 2 判断该坐标是否可以走动,至于为什么要这样做,因为这样就可以判断跨步或者不跨步是否可以走动的条件 。

代码详解如下:

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
#define mk make_pair
#define umap unordered_map
#define ___G cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
using namespace std;
const int N = 500 + 10;
using PII = pair<int,int>;
int n,m;
int g[N][N];	// 迷宫图
bool vis[N][N];	// 标记是否走动过// 移动坐标 
int dx[8] = {1,-1,2,-2,0,0,0,0};
int dy[8] = {0,0,0,0,1,-1,2,-2};// 判断走动条件 
inline bool isRun(int x,int y)
{return (x >= 0 && x < n && y >= 0 && y < m && !g[x][y] && !vis[x][y]);
}inline int BFS(int x,int y)
{int step = 0;// 存储走动坐标 queue<PII>q;// 存储起点 并标记 q.push(mk(x,y));vis[x][y] = true;// 开始 BFS 走动 // 这一层是走动的每一步 while(q.size()){int sz = q.size();// 这一层是判断走动的方向 while(sz--){// 开始取出存储的走动坐标 auto now = q.front();q.pop();// 如果当前坐标走到了出口,返回步数 if(now.x == n - 1 && now.y == m - 1){return step;}// 标记当前坐标 vis[now.x][now.y] = true;// 判断走动的方向 for(int i = 0;i < 8;++i){// bx 和 by 是走动第一步下一个坐标 int bx = now.x + dx[i];int by = now.y + dy[i];// tx 和 ty 是跨步的判断,// 这里 dx[i] / 2 有效的避免了数组越界int tx = now.x + (dx[i]>>1);int ty = now.y + (dy[i]>>1);// 如果可以走动第一步,并且也可以跨步 if(isRun(bx,by) && !g[tx][ty]){// 存储该坐标 并标记 q.push(mk(bx,by)); vis[bx][by] = true;} }}	// 开始走动累加步数 ++step;}// 如果无法到达终点,返回 -1 return -1;
}inline void solve()
{cin >>n >>m;for(int i = 0;i < n;++i){for(int j = 0;j < m;++j){cin >> g[i][j];}}cout << BFS(0,0) <<endl;
}signed main()
{___G;
//	freopen("a.txt","r",stdin);int _t = 1;//cin >> _t;while(_t--){solve();}return 0;
}

最后提交:

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

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

相关文章

得帆信息资深HR小姐姐——施青青:人力资源数字化转型带给一线HR从业者的新机遇

各行各业的专家们都在谈【企业数字化转型】&#xff0c;但是对于一线从业者来说&#xff0c;还是很抽象的。“什么叫数字化转型&#xff1f;数字化转型和我的工作有什么关系&#xff1f;数字化转型对于我的工作会带来什么样的影响&#xff1f;”如果一线从业者没有实际接触过数…

JavaScript中的代理对象(proxy)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建代理对象⭐ 使用代理对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友…

华为智能高校出口安全解决方案(2)

本文承接&#xff1a; https://qiuhualin.blog.csdn.net/article/details/131475315?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的基础网络安全&业务部署与优化的部署流程。 华为智能高校出口安全解决方案&#xff08;2&#xff09; 课程地址基础网络…

电脑C盘爆红怎么办?(小白篇)

文章目录 前言&#xff1a;1、清理临时和系统文件2、更改电脑默认软件安装位置3、微信、QQ文件存储路径放在其它盘4、卸载一些不常用的软件彩蛋 前言&#xff1a; C盘作为电脑的系统盘&#xff0c;如果出现爆满或者剩余空间很小整个C盘变红&#xff0c;这样会导致电脑系统运行…

手持式静电场测试仪的功能说明

手持式静电场测试仪是一种便携式的测试仪器&#xff0c;能够快速、准确地测量静电场的强度和分布情况。其主要功能包括&#xff1a; 测量静电场强度&#xff1a;手持式静电场测试仪可以测量静电场的强度&#xff0c;包括静电场的电压、电场强度、电势差等参数。 测量静电电荷&…

堆排序代码及时间空间复杂度

堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的排序算法&#xff0c;它的时间复杂度为 O(n log n)&#xff0c;并且具有原地排序&#xff08;in-place sorting&#xff09;的特点。下面是堆排序的代码示例和时间空间复杂度分析&#xff0c;希望对大家有所…

用selenium和xpath定位元素并获取属性值以及str字符型转json型

页面html如图所示&#xff1a; 要使用xpath定位这个div元素&#xff0c;并且获取其属性data-config的内容值。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Optionshost127.0.0.1 port10808 …

springboot 获取参数

1.获取简单参数 2.实体对象参数

数字森林:无人机航测技术在林业调查中的应用

林业调查是林业工作的基础&#xff0c;对于森林资源的管理、规划、保护、经济发展和农业种植等方面都具有重要的意义。传统林业调查主要依赖人工进行&#xff0c;存在工作效率低、数据精度低、数据分析困难、受地形限制、无法实时监测等缺陷。 随着科技的不断发展&#xff0c;无…

低功耗蓝牙物联网:未来连接的无限可能

物联网是连接各种设备和传感器的网络&#xff0c;其目的是实现信息的交换和共享&#xff0c;提高效率并优化生活。在这个领域&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;正在发挥着越来越重要的作用。 低功耗蓝牙是一种无线通信技术&#xff0c;它的主要特点是低功耗和…

【Hadoop】HDFS API 操作大全

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

中秋节听夜曲,Android OpenGL 呈现周董专属的玉兔主题音乐播放器

概述 前几天发现QQ音乐有个好玩的功能&#xff0c;为用户提供了多种 播放器主题&#xff0c;其中 原神 的主题让我眼前一亮&#xff1a; 当然&#xff0c;诸如 换肤、主题 类的功能已经屡见不鲜&#xff0c;但这类沉浸式播放器的听歌体验确实不错。 见猎心喜&#xff0c;正好…