javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》

导读:算法哥好久没分享有趣的算法题了,有点寂寞空虚冷,今天看到一道似曾相识的题目,而且难度是hard模式,勾起了算法哥的征服欲。特分享之!


题目描述

「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。

游戏地图用大小为 m * n 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。

现在你将作为玩家参与游戏,按规则将箱子 'B' 移动到目标位置 'T' :

玩家用字符 'S' 表示,只要他在地板上,就可以在网格中向上、下、左、右四个方向移动。

地板用字符 '.' 表示,意味着可以自由行走。

墙用字符 '#' 表示,意味着障碍物,不能通行。

箱子仅有一个,用字符 'B' 表示。相应地,网格上有一个目标位置 'T'。

玩家需要站在箱子旁边,然后沿着箱子的方向进行移动,此时箱子会被移动到相邻的地板单元格。记作一次「推动」。玩家无法越过箱子。返回将箱子推到目标位置的最小 推动 次数,如果无法做到,请返回 -1。

题目来源:LeetCode 1263

6d3d19b794f40f0b0f9fbb956f3d2755.png

示例一

题目分析

其实这个题目,一看就能想到需要用广度优先搜索算法(BFS),我们也很自然的会想到,模拟推箱子的过程即可!

过程:

以箱子为起点,尝试每一步4个方向移动,移动的前提是,人可以达到箱子移动过去的格子的反方向的格子!所以这里还需要判断一下,人从当前位置是否可以到达那个反方向的格子。至此题目的思路就出来了。

在BFS的时候,我们需要把搜索过的人和箱子的位置做一个标记,防止重复搜索,因为变化位置的只有可能是人的位置,以及箱子的位置,所以我们可以用一个四维数组来标记人和箱子的状态,BFS过程中,检查一下人和箱子的位置是不是以前搜索过,搜索过就放弃,反之就继续搜索!

显然,搜索的起点是初始状态下箱子和人的位置,我们标记为(bx,by)和(sx,sy),初始移动次数是0,然后我们从起点出发,遍历箱子的4个方向,检查是否可以推过去(推过去的格子是不是墙,人是不是可以到达推过去格子反方向的格子),如果可以,把新的箱子位置和人的位置,以及推动箱子次数,作为一个新的状态加入到BFS的队列里,继续搜索直到走到位置T.

源码如下:

d0ea8785125fbe8db0374d6f37bd34e2.png
c9ace55d81d19a987a9b4c015ccd3227.png

源码


复杂度分析

07094bf84931f0f8e91212dc50786527.png

运行时间空间

复杂度,首先我们搜索的时候是从人和箱子的位置来搜索的,箱子的位置有m*n种,人的位置也有m*n种,但是实际在搜索过程中,人永远在箱子相邻4个格子,所以人的位置对于每个箱子位置是4个,总的搜索状态是m*n*4的,其次每次推动过程中有一次判断人的位置是否可以到达箱子推动方向反方向的格子的判断,这个步骤是m*n的复杂度,所以总的时间复杂度是O(m*n*m*n)的,击败了100%的提交!


总结

这个题目是一个比较经典的BFS算法的题目,虽然比较容易想到,但是实现起来是有一定难度的,主要要解决以下几个问题:

  1. 想到模拟箱子推动的过程,用BFS算法模拟;
  2. 知道根据箱子和人的位置来标记已经搜索过的状态;
  3. 两层BFS的嵌套使用,外层BFS解决箱子搜索的问题,里层BFS解决判断人是否可达到箱子推动反方向格子的问题;
  4. 一些编码上的技巧,比如通过方向向量,向4个方向搜索等;

题目分享完毕,记得给算法哥点赞、分享、评论、转发哦!这都是算法哥继续分享下去的最大鼓励!

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

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

相关文章

利用Excel VBA实现批量数据分组转置

问题:如上图所示,按lon,lat分组,再进行转置。 VBA代码: Sub admin()Dim conn, xRs, xFdSet conn = CreateObject("ADODB.Connection")conn.Open "Provider=Microsoft.Jet.Oledb.4.0;" & _"Extended Properties= Excel 8.0;hdr=yes;IMEX=1 …

Git之Stash(储藏)备份当前的工作区的内容

1 今天遇到的问题 我Git关联的项目,本地做了修改,然后我需要git pull拉别人的代码或者我需要修改其它的bug,本地做了修改我又不想合并,这个时候就可以使用git stash git stash:备份当前的工作区的内容,将当前的工作区内容保存到Git栈中 git stash list:显示Git栈内的所有备份…

Comparison of video container formats

Comparison of video container formats MOV跟MP4具体区别在哪里?转载于:https://www.cnblogs.com/jingzhishen/p/5205235.html

.NET 7 Preview 3添加了这些增强功能

.NET 7 Preview 3 已发布, .NET 7 的第三个预览版包括对可观察性、启动时间、代码生成、GC Region、Native AOT 编译等方面的增强。有兴趣的用户可以下载适用于 Windows、macOS 和 Linux 的 .NET 7 Preview 3。Microsoft 建议使用Visual Studio 17.2 Preview 3 的 预…

MySQL基本分区表

2019独角兽企业重金招聘Python工程师标准>>> 准备工作 1、查看数据库的信息 了解当前的Mysql数据库的版本和平台以及字符集等相关信息 mysql> status -------------- mysql Ver 14.14 Distrib 5.6.17, for Win64 (x86_64)Connection id: 4 Current dat…

mysql分页存储过程 分页查询语句_分页存储过程(用存储过程实现数据库的分页代码)...

用存储过程实现数据库的分页代码,加快页面执行速度。具体的大家可以测试下。--*******************************************************--* 分页存储过程 *--* 撒哈拉大森林 *--* 2010-6-28 *--*******************************************************if exists(select * f…

分段线性拟合经典案例:计算多年气温最低值和最高值的分段线性变化趋势(附分段线性拟合工具下载)

分段线性回归:是用虚拟变量估计不同数量水平的解释变量对被解释变量的影响。在经济关系中,当解释变量X的值达到某一水平X′之前,与被解释变量之间存在某种线性关系;当解释变量X的值达到或者超过X′以后,与被解释变量的关系就会发生变化。此时,如果已知X的转折点X′,我们…

Git之删除文件

1 问题 git关联删除文件 2 git 删除命令 git rm file 3 svn 删除命令 svn delete file

谷歌不支持调用摄像头麦克风_谷歌发布安卓11系统:全新界面、更严的隐私管理...

来源:快科技在发布三个beta版之后,谷歌刚刚发布了安卓11(Android 11)正式版,主要加强了聊天气泡、安全隐私、电源菜单,以及对各种新屏幕,如瀑布屏、折叠屏、双屏的支持。最近几个版本的安卓系统其实变化都不是很大&…

POJ2676,HDU4069解决数独的两种实现:DFS、DLX

搜索实现:解决数独有两种思考策略,一种是枚举当前格能填的数字的种数,这里有一优化策略就是先搜索能填入种数小的格子;另一种是考虑处理某一行(列、宫)时,对于某一个没用过的数字,若…

工业互联网上市公司.NET开发岗位来袭!!!

01公司简介2022 ABOUT /公司简介安徽容知日新科技股份有限公司(股票代码:688768)于2007年在合肥市成立,是一家工业互联网领域的高新技术企业,为客户提供设备智能运维平台解决方案和动设备预测性维护产品及服务。容知日…

mysql数据库密码为空_注意MySQL数据库用户root密码为空

注意MySQL数据库用户root密码为空文章作者:网友投稿 发布时间:2008-08-14 19:11:51 来源:网络看到这大家肯定知道了,就是利用mysql输出一个可执行的文件而已。为什么不用bat呢,因为启动运行时会有明显的dos窗口出来&…

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记24 popovers弹窗

上几话中我们详细了解了几种segue,我们也了解到了多MVC模式的几种控制器,比如导航、选项卡和分栏,除了这三种多MVC的模式之外,还有一种popover,它跟其他三种不太一样。首先先来认识一下popover(弹窗&#x…

shell 脚本加密

想想好久没更新博客了,今天在群里看到讨论关于shell脚本加密的事情。想想也是,我们在写脚本有时候会配置相关账号和密码的事情,这样只要能权限都能看到该信息,非常的不安全,有没有在正常运行的情况下对文件进行加密。大…

React Native之didFocus和didBlur

1 didFocus和didBlur解释 didFocus - the screen focused (if there was a transition, the transition completed)didBlur - the screen unfocused (if there was a transition, the transition completed) didFocus是指当前页面第一次加载的时候会调用一次 didBlur是指当前…

python语法详解_解析 Python3 基础语法

行与缩进 python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。 缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下: if True: print ("True") else: print ("False") Color…

ENVI扩展工具:利用波段运算修改NaN方法总结

NaN为Not a Number的缩写,在遥感图像中属于异常值。很多用户有修改NaN的需求,比如把0值修改为NaN,或把NaN修改为0值等。由于波段运算公式较为复杂,现归纳如下。 1. 直接利用波段运算进行 Ÿ 修改0值为NaN – float(b1)*b1/b1 Ÿ 修改特定值(250)为Na…

ASP.NET 6 中间件 - 介绍与基础

这是一个关于 .NET 6 中间件的系列文章。在这个系列中,我们将了解到什么是中间件,它能够做什么,以及我们为什么要使用它,并演示几种不同类型的中间件的实现。之后,我们会进一步了解中间件所在的管道,以及如…

数组的迭代数组里面每个对象添加属性值_JS数组和对象循环遍历的几种实现方式...

数组遍历1. 普通for循环let arr [1,2,3,4,5] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 输出结果 // 1 // 2 // 3 // 4 // 52. 优化普通for循环let arr [1,2,3,4,5] for(var j 0,len arr.length; j < len; j){console.log(arr[j]); }3. forEach循…