LeetCode 5208. 穿过迷宫的最少移动次数
5208. 穿过迷宫的最少移动次数
可以访问我的博客,嘎嘎
题目描述
思想
想法很简单,就是用BFS一层一层的搜索就可以。但针对这个问题,有些地方需要改变下。
首先是当前位置
以前在一个二维地图上进行BFS,当前位置都是用(i,j)(i,j)(i,j)这样一个坐标表示的,但现在这条小蛇独占了2个格子,也就是需要用两个坐标来表示,即(i1,j1),(i2,j2)(i_1,j_1),(i_2,j_2)(i1,j1),(i2,j2),约定第一个坐标表示蛇的尾部,第二个坐标表示蛇的头部。为了方便实现,我们定义一个结构体:
struct Node {int a, b, c, d;Node() {}Node(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) {}
};
其中(a,b)
对应着(i1,j1)(i_1,j_1)(i1,j1),同理,(c,d)
对应着(i2,j2)(i_2,j_2)(i2,j2)。
然后是记录已经访问过的“小蛇的位置”
以前都是用visited[i][j]
来表示(i,j)(i,j)(i,j)有没有被访问过,而在这里,我定义了一个集合:
set<Node> visited;
再有就是“如何走”
从某个位置可以走的方案一共四种,分别是:
Node try_right = Node(p.a, p.b+1, p.c, p.d+1);
Node try_down = Node(p.a+1, p.b, p.c+1, p.d);
Node try_clockwise = Node(p.a, p.b, p.a+1, p.b);
Node try_anti = Node(p.a, p.b, p.a, p.b+1);
代码实现
struct Node {int a, b, c, d;Node() {}Node(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) {}bool operator < (const Node &n) const {if (a != n.a) return a < n.a;if (b != n.b) return b < n.b;if (c != n.c) return c < n.c;if (d != n.d) return d < n.d;return false;}
};class Solution {public:int minimumMoves(vector<vector<int>>& grid) {Node start = Node(0, 0, 0, 1);set<Node> visited;visited.insert(start);deque<Node> d;d.push_back(start);int m = grid.size(), n = grid[0].size();int ans = 0;while (!d.empty()) {int len = d.size();for (int i = 0 ; i < len; i++) {Node &p = d.front();if (p.a == (m-1) && p.c == (m-1) && p.b == (n-2) && p.d == (n-1)) {return ans;}Node try_right = Node(p.a, p.b+1, p.c, p.d+1);Node try_down = Node(p.a+1, p.b, p.c+1, p.d);Node try_clockwise = Node(p.a, p.b, p.a+1, p.b);Node try_anti = Node(p.a, p.b, p.a, p.b+1);if (p.a == p.c) { //小蛇是横着的if (try_right.d < n && grid[try_right.c][try_right.d] != 1 && visited.find(try_right) == visited.end()) {visited.insert(try_right);d.push_back(try_right);}if (try_down.a < m && grid[try_down.a][try_down.b] != 1 && grid[try_down.c][try_down.d] != 1) {if (visited.find(try_down) == visited.end()) {visited.insert(try_down);d.push_back(try_down); }if (visited.find(try_clockwise) == visited.end()) {visited.insert(try_clockwise);d.push_back(try_clockwise);}}}else { //小蛇是竖着的if (try_down.c < m && grid[try_down.c][try_down.d] != 1 && visited.find(try_down) == visited.end()) {visited.insert(try_down);d.push_back(try_down);}if (try_right.b < n && grid[try_right.a][try_right.b] != 1 && grid[try_right.c][try_right.d] != 1) {if (visited.find(try_right) == visited.end()) {visited.insert(try_right);d.push_back(try_right);}if (visited.find(try_anti) == visited.end()) {visited.insert(try_anti);d.push_back(try_anti);}}}d.pop_front();}ans++;}return -1;}
};
LeetCode 5208. 穿过迷宫的最少移动次数相关推荐
- LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)
文章目录 1. 题目 2. 解题 1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格. 蛇会从左上角((0, 0) ...
- 【数据结构与算法】之深入解析“穿过迷宫的最少移动次数”的求解思路与算法示例
一.题目要求 你还记得那条风靡全球的贪吃蛇吗?我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格.蛇会从左上角((0, 0) 和 (0, 1))开始移动,用 0 ...
- LeetCode 2139. 得到目标值的最少行动次数(贪心)
文章目录 1. 题目 2. 解题 1. 题目 你正在玩一个整数游戏.从整数 1 开始,期望得到整数 target . 在一次行动中,你可以做下述两种操作之一: 递增,将当前整数的值加 1(即, x = ...
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...
- LeetCode简单题之使每位学生都有座位的最少移动次数
题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示.给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置.同时给你一个长度为 n 的数组 studen ...
- LeetCode 2134. 最少交换次数来组合所有的 1 II(数组*2 + 滑动窗口)
文章目录 1. 题目 2. 解题 1. 题目 交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值. 环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 . 给你一个 二 ...
- LeetCode 2037. 使每位学生都有座位的最少移动次数
文章目录 1. 题目 2. 解题 1. 题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示. 给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置. ...
- LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)
文章目录 1. 题目 2. 解题 1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 . 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6). 每次操作中,你可以选择 任 ...
- LeetCode 1674. 使数组互补的最少操作次数(差分思想)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...
- LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 2.1 n^2 解法 2.2 nlogn 解法 197 / 1891,前10.4% 435 / 6154,前7.07% 前三题如下: LeetCode 5557. 最 ...
最新文章
- vue-route+webpack部署单页路由项目,访问刷新出现404问题
- smartforms金额或者数量字段显示不出来
- 三个分级基金(银华100、申万深成、国联双禧)对比图(zz from Fund@newsmth)
- Fiori里花瓣的动画效果实现原理
- HI3559A和AI深度学习框架caffe
- windows android ios,TIM for Windows/iOS/Android v2.2.6 正式版发布
- jQuery入门[2]-选择器
- 为什么哲学是最难的学科_为什么来读哲学系?
- 2022年PMP考试安排
- 傅里叶变换的相关实验——matlab实现
- Android studio - UI 界面设计(仿问卷星登陆注册界面)
- NMOS和PMOS电流流向以及导通条件
- linux使用iptables屏蔽ip段,利用iptables屏蔽IP段
- 实战案例!使用 Python 进行 RFM 客户价值分析!
- 【研究生】横扫13项中文NLP任务:香侬科技提出汉语字形表征向量Glyce+田字格CNN...
- 这8种恶心虫子 你可能每天都在吃!
- docker 命令补全
- 啥也不懂,实现Deepin系统如何有效安装TL-WDN5200H v2.0 linux驱动,自测成功
- linux统计文件单词数,Linux怎么统计文本的的行数/单词数和字符数?
- SpringBoot layui数据表格数据接口的配置
热门文章
- java excel 密码_用java实现对EXCEL加打开密码的方法?
- WinEdit编辑器中中文乱码
- Win11怎么把手机投屏到电脑上?
- 力扣数据库(end09.02)
- 阿里星计算机专业好就业吗,不懂就问,本科北邮计算机,硕士北大计算机,现在杭州阿里,能有几个街薪?...
- html 分页样式首页下一页,css中分页样式怎么设置
- 查看已下载的Docker镜像latest具体版本
- 从0到1的电商架构应该怎么做?有哪些坑?
- vijos- P1385盗窃-月之眼 (水题 + python)
- 【YOLOV5-5.x 源码解读】google_utils.py