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. 穿过迷宫的最少移动次数相关推荐

  1. LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)

    文章目录 1. 题目 2. 解题 1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格. 蛇会从左上角((0, 0) ...

  2. 【数据结构与算法】之深入解析“穿过迷宫的最少移动次数”的求解思路与算法示例

    一.题目要求 你还记得那条风靡全球的贪吃蛇吗?我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格.蛇会从左上角((0, 0) 和 (0, 1))开始移动,用 0 ...

  3. LeetCode 2139. 得到目标值的最少行动次数(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 你正在玩一个整数游戏.从整数 1 开始,期望得到整数 target . 在一次行动中,你可以做下述两种操作之一: 递增,将当前整数的值加 1(即, x = ...

  4. LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...

  5. LeetCode简单题之使每位学生都有座位的最少移动次数

    题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示.给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置.同时给你一个长度为 n 的数组 studen ...

  6. LeetCode 2134. 最少交换次数来组合所有的 1 II(数组*2 + 滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值. 环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 . 给你一个 二 ...

  7. LeetCode 2037. 使每位学生都有座位的最少移动次数

    文章目录 1. 题目 2. 解题 1. 题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示. 给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置. ...

  8. LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 . 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6). 每次操作中,你可以选择 任 ...

  9. LeetCode 1674. 使数组互补的最少操作次数(差分思想)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...

  10. LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)

    文章目录 1. 题目 2. 解题 2.1 n^2 解法 2.2 nlogn 解法 197 / 1891,前10.4% 435 / 6154,前7.07% 前三题如下: LeetCode 5557. 最 ...

最新文章

  1. vue-route+webpack部署单页路由项目,访问刷新出现404问题
  2. smartforms金额或者数量字段显示不出来
  3. 三个分级基金(银华100、申万深成、国联双禧)对比图(zz from Fund@newsmth)
  4. Fiori里花瓣的动画效果实现原理
  5. HI3559A和AI深度学习框架caffe
  6. windows android ios,TIM for Windows/iOS/Android v2.2.6 正式版发布
  7. jQuery入门[2]-选择器
  8. 为什么哲学是最难的学科_为什么来读哲学系?
  9. 2022年PMP考试安排
  10. 傅里叶变换的相关实验——matlab实现
  11. Android studio - UI 界面设计(仿问卷星登陆注册界面)
  12. NMOS和PMOS电流流向以及导通条件
  13. linux使用iptables屏蔽ip段,利用iptables屏蔽IP段
  14. 实战案例!使用 Python 进行 RFM 客户价值分析!
  15. 【研究生】横扫13项中文NLP任务:香侬科技提出汉语字形表征向量Glyce+田字格CNN...
  16. 这8种恶心虫子 你可能每天都在吃!
  17. docker 命令补全
  18. 啥也不懂,实现Deepin系统如何有效安装TL-WDN5200H v2.0 linux驱动,自测成功
  19. linux统计文件单词数,Linux怎么统计文本的的行数/单词数和字符数?
  20. SpringBoot layui数据表格数据接口的配置

热门文章

  1. java excel 密码_用java实现对EXCEL加打开密码的方法?
  2. WinEdit编辑器中中文乱码
  3. Win11怎么把手机投屏到电脑上?
  4. 力扣数据库(end09.02)
  5. 阿里星计算机专业好就业吗,不懂就问,本科北邮计算机,硕士北大计算机,现在杭州阿里,能有几个街薪?...
  6. html 分页样式首页下一页,css中分页样式怎么设置
  7. 查看已下载的Docker镜像latest具体版本
  8. 从0到1的电商架构应该怎么做?有哪些坑?
  9. vijos- P1385盗窃-月之眼 (水题 + python)
  10. 【YOLOV5-5.x 源码解读】google_utils.py