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 …

.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…

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

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

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

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

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

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

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

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

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

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

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…

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循…

Blend4精选案例图解教程(三):一键拖拽

原文:Blend4精选案例图解教程&#xff08;三&#xff09;&#xff1a;一键拖拽拖拽效果&#xff0c;常规实现方法是定义MoveLeftDwon、MoveLeftUp、MouseMove事件&#xff0c;在Blend的世界里&#xff0c;实现对象的拖拽&#xff0c;可以不写一行代码&#xff0c;而且非常简单&…

python画气泡图_​用Python把图做的好看点:用Matplotlib画个好看的气泡图

我们继续来把简单的图形丢到极坐标&#xff0c;这次是气泡图和柱状图&#xff0c;临摹的对象是澎湃美数课这个图看起来很好看&#xff0c;原理其实很简单&#xff0c;把柱状图和气泡图从笛卡尔坐标系中转移到极坐标系中来就OK 我们开始本次的临摹吧 本期的主题如下&#xff1a;…

Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册

前言假设我们有三个Service类实现了同一接口&#xff0c;示例代码如下&#xff1a;public interface IService { } public class ServiceA : IService { } public class ServiceB : IService { } public class ServiceC : IService { }我们希望在运行时使用依赖注入指定其具体…

pytorch forward_【Pytorch部署】TorchScript

TorchScript是什么&#xff1f;TorchScript - PyTorch master documentation​pytorch.orgTorchScript是一种从PyTorch代码创建可序列化和可优化模型的方法。任何TorchScript程序都可以从Python进程中保存&#xff0c;并加载到没有Python依赖的进程中。我们提供了一些工具来增量…

兼容ie8 rgba()用法

今天遇到了一个问题&#xff0c;要在一个页面中设置一个半透明的白色div。这个貌似不是难题&#xff0c;只需要给这个div设置如下的属性即可&#xff1a; background: rgba(255,255,255,.1); 但是要兼容到ie8。这个就有点蛋疼了。因为ie8不支持rgba()函数。下面我们总结一下rgb…

python中的标识符能不能使用关键字_Python中的标识符不能使用关键字

Python中的标识符不能使用关键字答&#xff1a;√智慧职教: 检查客室座椅外观良好&#xff0c;确认?无破损答&#xff1a;坐垫 靠背关于投标报价时综合单价的确定&#xff0c;下列做法中正确的是()答&#xff1a;以项目特征描述为依据确定综合单价城市总体规划调查时&#xff…

C# WPF实战项目升级了

概述之前用Caliburn.Micro搭建的WPF实战项目&#xff0c;CM框架选用了 3.0.3&#xff0c;实际上CM框架目前最新版已经到4.0。173了&#xff0c;所有很有必须升级一下项目了. 本来打算把平台框架也直接升级到.NET 6 的&#xff0c;但是项目里面很多库不支持最新的平台版本&#…