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

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

你还记得那条风靡全球的贪吃蛇吗?

我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。
蛇会从左上角((0, 0) 和 (0, 1))开始移动。
我们用 0 表示空单元格,用 1 表示障碍物。
蛇需要移动到迷宫的右下角((n-1, n-2) 和 (n-1, n-1))

每次移动,蛇可以这样走:

  • 如果没有障碍,则向右移动一个单元格。并仍然保持身体的水平/竖直状态。

  • 如果没有障碍,则向下移动一个单元格。并仍然保持身体的水平/竖直状态。

  • 如果它处于水平状态并且其下面的两个单元都是空的,就顺时针旋转 90 度。蛇从((r, c)、(r, c+1))移动到 ((r, c)、(r+1, c))

  • 如果它处于竖直状态并且其右面的两个单元都是空的,就逆时针旋转 90 度。蛇从((r, c)、(r+1, c))移动到((r, c)、(r, c+1))

返回蛇抵达目的地所需的最少移动次数

如果无法到达目的地,请返回 -1。

示例 1:

输入:grid = [[0,0,0,0,0,1],[1,1,0,0,1,0],[0,0,0,0,1,1],[0,0,1,0,1,0],[0,1,1,0,0,0],[0,1,1,0,0,0]]
输出:11
解释:
一种可能的解决方案是 
[,, 顺时针旋转,,,,,, 逆时针旋转,,]。示例 2:
输入:grid = [[0,0,1,1,1,1],[0,0,0,0,1,1],[1,1,0,0,0,1],[1,1,1,0,0,1],[1,1,1,0,0,1],[1,1,1,0,0,0]]
输出:9提示:
2 <= n <= 100
0 <= grid[i][j] <= 1
蛇保证从空单元格开始出发。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-reach-target-with-rotations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 把尾巴的坐标 x,y 还有方向 d,三个信息编码成101进制数
  • 然后蛇可以三种走法:前进、整体平移、绕尾巴旋转
class Solution {vector<vector<int>> dir = {{0,1}, {1,0}};int n;
public:int minimumMoves(vector<vector<int>>& grid) {n = grid.size();if(grid[n-1][n-2] || grid[n-1][n-1])return -1;int state, nt, pos, d, nd, i, j, k, x, y, x1, y1, x2, y2;queue<int> q;//将xy坐标压缩为一个数,再乘以 101,+ 方位,全部压缩为一个数unordered_set<int> vis;q.push(0);// pos = (101*i + j)*101 + dirint step = 0, size;int target = (101*(n-1)+(n-2))*101;while(!q.empty()){size = q.size();while(size--){state = q.front();q.pop();if(state == target)return step;d = state%101;pos = state/101;i = pos/101;//原来尾巴位置j = pos%101;// cout << " i :" << i << " j: " << j << " d : " << d << endl;x = i+dir[d][0];//原来头的位置y = j+dir[d][1];// 直行,方向不变x1 = i+dir[d][0];//下一个尾巴占据的位置y1 = j+dir[d][1];x2 = x+ dir[d][0];//下一个头的位置y2 = y+ dir[d][1];nt = (101*x1+y1)*101+d;//下一个状态if(ok(x2, y2) && grid[x2][y2]== 0&& !vis.count(nt)){vis.insert(nt);q.push(nt);//下一个状态}// 平移,方向不变nd = d == 0 ? 1 : 0;x1 = i+dir[nd][0];//下一个尾巴占据的位置y1 = j+dir[nd][1];x2 = x+ dir[nd][0];//下一个头的位置y2 = y+ dir[nd][1];nt = (101*x1+y1)*101+d;//下一个状态if(ok(x1, y1) && grid[x1][y1]==0 && ok(x2, y2) && grid[x2][y2]== 0&& !vis.count(nt)){vis.insert(nt);q.push(nt);}// 旋转,方向变化, 尾巴位置没变nt = state/101*101 + nd;//下一个位置的编码if(ok(x1, y1) && grid[x1][y1]==0 && ok(x2, y2) && grid[x2][y2]== 0&& !vis.count(nt)){vis.insert(nt);q.push(nt);}}step++;}return -1;}bool ok(int x, int y){return x>=0 && x < n && y>=0 && y<n;}
};

132 ms 17.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

Django模板(编写html代码

1.模板 用于编写html代码&#xff0c;还可以嵌入模板代码更快更方便的完成页面开发&#xff0c;再通过在视图中渲染模板&#xff0c;将生成最终的html字符串返回给客户端浏览器 模版致力于表达外观&#xff0c;一个视图可以使用任意一个模板&#xff0c;一个模板可以供多个视图…

用户画像之Spark ML实现

用户画像之Spark ML实现 1 Spark ML简单介绍 Spark ML是面向DataFrame编程的。Spark的核心开发是基于RDD&#xff08;弹性分布式数据集&#xff09;&#xff0c;但是RDD&#xff0c;但是RDD的处理并不是非常灵活&#xff0c;如果要做一些结构化的处理&#xff0c;将RDD转换成…

[Kaggle] Digit Recognizer 手写数字识别(神经网络)

文章目录1. baseline2. 改进2.1 增加训练时间2.2 更改网络结构Digit Recognizer 练习地址 相关博文&#xff1a; [Hands On ML] 3. 分类&#xff08;MNIST手写数字预测&#xff09; [Kaggle] Digit Recognizer 手写数字识别 1. baseline 导入包 import tensorflow as tf fr…

逻辑回归原理

逻辑回归原理 1 逻辑回归简介 logistic回归&#xff08;LR&#xff09;&#xff0c;是一种广义的线性回归分析模型&#xff0c;常用于数据挖掘&#xff0c;疾病预测&#xff0c;经济预测等方面。 优点&#xff1a;计算代价低&#xff0c;思路清晰易于理解和实现&#xff1b;…

LeetCode 956. 最高的广告牌(DP)

文章目录1. 题目2. 解题1. 题目 你正在安装一个广告牌&#xff0c;并希望它高度最大。 这块广告牌将有两个钢制支架&#xff0c;两边各一个。每个钢支架的高度必须相等。 你有一堆可以焊接在一起的钢筋 rods。 举个例子&#xff0c;如果钢筋的长度为 1、2 和 3&#xff0c;则…

Tensorflow线程队列与IO操作

目录 Tensorflow线程队列与IO操作 1 线程和队列 1.1 前言 1.2 队列 1.3 队列管理器 1.4 线程协调器 2 文件读取 2.1 流程 2.2 文件读取API&#xff1a; 3 图像读取 3.1 图像读取基本知识 3.2 图像基本操作 3.3 图像读取API 3.4 图片批处理流程 3.5 读取图片案例 …

LeetCode 1298. 你能从盒子里获得的最大糖果数(BFS)

文章目录1. 题目2. 解题1. 题目 给你 n 个盒子&#xff0c;每个盒子的格式为 [status, candies, keys, containedBoxes] &#xff0c;其中&#xff1a; - 状态字 status[i]&#xff1a;整数&#xff0c;如果 box[i] 是开的&#xff0c;那么是 1 &#xff0c;否则是 0 。 - 糖…

给javascript初学者的24条最佳实践

1.使用 代替 JavaScript 使用2种不同的等值运算符&#xff1a;|! 和 |!&#xff0c;在比较操作中使用前者是最佳实践。 “如果两边的操作数具有相同的类型和值&#xff0c;返回true&#xff0c;!返回false。”——JavaScript&#xff1a;语言精粹 然而&#xff0c;当使用和&a…

LeetCode 1614. 括号的最大嵌套深度

文章目录1. 题目2. 解题1. 题目 如果字符串满足一下条件之一&#xff0c;则可以称之为 有效括号字符串&#xff08;valid parentheses string&#xff0c;可以简写为 VPS&#xff09;&#xff1a; 字符串是一个空字符串 ""&#xff0c;或者是一个不为 "("…

[AngularJS]Chapter 1 AnjularJS简介

创建一个完美的Web应用程序是很令人激动的&#xff0c;但是构建这样应用的复杂度也是不可思议的。我们Angular团队的目标就是去减轻构建这样AJAX应用的复杂度。在谷歌我们经历过各种复杂的应用创建工作比如&#xff1a;GMail、Map和日历。我们认为我们有必要把这些经验总结下来…

LeetCode 1615. 最大网络秩(出入度)

文章目录1. 题目2. 解题1. 题目 n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。 每个 roads[i] [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。 两座不同城市构成的 城市对 的 网络秩 定义为&#xff1a;与这两座城市 直接 相连的道路总数。如果…

使用JSLint提高JS代码质量

随着富 Web 前端应用的出现&#xff0c;开发人员不得不重新审视并重视 JavaScript 语言的能力和使用&#xff0c;抛弃过去那种只靠“复制 / 粘贴”常用脚本完成简单前端任务的模式。JavaScript 语言本身是一种弱类型脚本语言&#xff0c;具有相对于 C 或 Java 语言更为松散的限…

Django工具:Git简介与基本操作

1.Git简介&#xff1a; 1.Git是目前世界上最先进的分布式版本控制系统 网址&#xff1a;http://github.com 2.总结git的两大特点&#xff1a; 版本控制&#xff1a;可以解决多人同时开发的代码问题&#xff0c;也可以解决找回历史代码的问题 分布式&#xff1a;Git是分布式…

LeetCode 1616. 分割两个字符串得到回文串

文章目录1. 题目2. 解题1. 题目 给你两个字符串 a 和 b &#xff0c;它们长度相同。 请你选择一个下标&#xff0c;将两个字符串都在 相同的下标 分割开。 由 a 可以得到两个字符串&#xff1a; aprefix 和 asuffix &#xff0c;满足 a aprefix asuffix &#xff0c;同理&am…

Kafka基础

Kafka基础 1 消息队列 1.1 什么是消息队列 消息队列&#xff08;MQ&#xff09;&#xff1a;消息队列&#xff0c;保存消息的队列。消息的传输过程中的容器&#xff1b;主要提供生产、消费接口供外部调用做数据的存储和获取。 1.2 为什么要有消息队列 当网站面对教大的流量…

系统总结学习 Python 的 14 张思维导图

本文主要涵盖了 Python 编程的核心知识&#xff08;暂不包括标准库及第三方库&#xff09;。 首先&#xff0c;按顺序依次展示了以下内容的一系列思维导图&#xff1a;基础知识&#xff0c;数据类型&#xff08;数字&#xff0c;字符串&#xff0c;列表&#xff0c;元组&#x…

LeetCode 1617. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径)

文章目录1. 题目2. 解题1. 题目 给你 n 个城市&#xff0c;编号为从 1 到 n 。同时给你一个大小为 n-1 的数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示城市 ui 和 vi 之间有一条双向边。 题目保证任意城市之间只有唯一的一条路径。换句话说&#xff0c;所有城市形成了…

MYSQL电脑客户端免安装教程以及出现问题解决方案

准备工作&#xff1a;window 7 64位旗舰版 MySQL 5.6.35免安装。 1. 下载MySQL 1.1 进入MySQL官网下载&#xff08;https://www.mysql.com/&#xff09;MySQL的安装包。 1.2. 根据自己电脑的位数(32位/64位)来下载响应的MySQL 、 2. 部署MySQL 2.1 解压压缩包到自己的某个盘…

[Kaggle] Digit Recognizer 手写数字识别(卷积神经网络)

文章目录1. 使用 LeNet 预测1.1 导入包1.2 建立 LeNet 模型1.3 读入数据1.4 定义模型1.5 训练1.6 绘制训练曲线1.7 预测提交2. 使用 VGG16 迁移学习2.1 导入包2.2 定义模型2.3 数据处理2.4 配置模型、训练2.5 预测提交Digit Recognizer 练习地址 相关博文&#xff1a; [Hands …

SparkCore基础

目录 Spark简介 1 什么是Spark 2 Spark特点 3 Spark分布式环境安装 3.1 Spark HA的环境安装 3.2 动态增删一个worker节点到集群 4 Spark核心概念 5 Spark案例 5.2 Master URL 5.3 spark日志的管理 5.4 WordCount案例程序的执行过程 6 Spark作业运行架构图&#xff…