1263. 推箱子

这篇具有很好参考价值的文章主要介绍了1263. 推箱子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

玩家用字符 ‘S’ 表示,只要他在地板上,就可以在网格中向上、下、左、右四个方向移动。
地板用字符 ‘.’ 表示,意味着可以自由行走。
墙用字符 ‘#’ 表示,意味着障碍物,不能通行。
箱子仅有一个,用字符 ‘B’ 表示。相应地,网格上有一个目标位置 ‘T’。
玩家需要站在箱子旁边,然后沿着箱子的方向进行移动,此时箱子会被移动到相邻的地板单元格。记作一次「推动」。
玩家无法越过箱子。
返回将箱子推到目标位置的最小 推动 次数,如果无法做到,请返回 -1。

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

题意:
规则其实就跟我们小时候玩的那个手机游戏–推箱子是一样的。

思路:
这道题其实思路很简单,和走迷宫是一个道理的,当你把箱子和人看成一个整体的时候,就是走迷宫,那直接搜索就可以解决了。

而这道题的不同之处在于,还有个人的位置要考虑。也就是从人出发,向四个方向搜索,如果人移动之后的位置是墙,那就是不合法的,回到上个状态搜索;如果人移动之后的位置是箱子的位置,就说明是合法的,然后将箱子进行对应的移动,判断是否合法,合法的话就存到q1队列中。那还有一种情况是人移动之后的位置不是墙也不是箱子的位置,那就用能走到此位置的最小值来更新它。因为我们最后的答案就是dp【】【】数组,所以这个值不能忽略,仍然要赋值。

详细的讲解如下:
n 是地图的列数 , m 是地图的行数。
solve()函数是用来判断 x , y 的位置是否合法。
sx,sy是人的位置。
bx,by是箱子的位置。
dp【i】【j】表示人在 i 位置箱子在 j 位置的最小步数。

首先将dp初始化为999999,然后将人的初始位置赋值为0.

然后将初始位置放入队列。

首先第一层循环,队列不为空的话:
新开一个队列 q1 , 用来存放从 q 中拿出的位置向四个方向移动后的合法位置。

sx1,sy1是对头的人的位置,bx1,by1是对头的箱子的位置。

如果此时箱子的位置是终点,那说明这个位置已经到达终点,dp[s1][b1]就是答案。

不是终点的话,像四个方向探索:
sx2,sy2是sx1,sy1移动后的人的位置,bx2,by2是bx1,by1移动后的箱子的位置。

首先判断sx2,sy2是否合法,不合法的话就下一个方向,合法的话判断,sx2,sy2人的位置是否和箱子的位置bx1,by1重合,重合的话才是真正意义上的推动箱子,就将箱子向同一方向移动,如果移动后的箱子的位置bx2,by2也合法的话,那dp【s2】【b2】的步数就是dp【s1】【b1】的步数加一,并将s2,b2加到q1中,因为他是新的合法的位置。

q遍历完,将q1的值赋给q,然后接着遍历q。这里q1的意义在于,因为我们是两层遍历q的循环,如果不设置q1的话,会造成循环的次序错误。

代码:文章来源地址https://www.toymoban.com/news/detail-684812.html

class Solution {
public:
    int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
    int n , m;
    bool solve(vector<vector<char>>& g , int& x , int& y){
        if(x < 0 || y < 0 || x >= m || y >= n || g[x][y] == '#')
            return false;
        return true;
    }
    int minPushBox(vector<vector<char>>& grid) {
        m = grid.size(); 
        n = grid[0].size();
        int sx , sy , bx , by;
        for(int i = 0 ; i < m ; i++){
            for(int j = 0 ; j < n ; j++){
                if(grid[i][j] == 'S'){
                    sx = i;
                    sy = j;
                }
                else if(grid[i][j] == 'B'){
                    bx = i;
                    by = j;
                }
            }
        }
        int dp[1010][1010];
        for(int i = 0 ; i < 1010 ; i++){
            for(int j = 0 ; j < 1010 ; j++){
                dp[i][j] = 9999999;
            }
        }
        queue<pair<int,int>> q;
        dp[sx*n + sy][bx*n + by] = 0;
        q.push({sx*n+sy , bx*n+by});
        while(!q.empty()){
            queue<pair<int , int>> q1;
            while(!q.empty()){
                auto [s1,b1] = q.front();
                q.pop();
                int sx1 = s1/n , sy1 = s1%n , bx1 = b1/n , by1 = b1%n;
                if(grid[bx1][by1] == 'T')
                    return dp[s1][b1];
                for(int i = 0 ; i < 4 ; i++){
                    int sx2 = sx1 + dir[i][0];
                    int sy2 = sy1 + dir[i][1];
                    int s2 = sx2*n+sy2;
                    if(!solve(grid , sx2 , sy2))
                        continue;
                    if(bx1 == sx2 && by1 == sy2){
                        int bx2 = bx1 + dir[i][0];
                        int by2 = by1 + dir[i][1];
                        int b2 = bx2*n + by2;
                        if(!solve(grid , bx2 , by2) || dp[s2][b2] <= dp[s1][b1]+1)
                            continue;
                        dp[s2][b2] = dp[s1][b1] + 1;
                        q1.push({s2 , b2});
                    }
                    else{
                        if(dp[s2][b1] <= dp[s1][b1])
                            continue;
                        dp[s2][b1] = dp[s1][b1];
                        q.push({s2 , b1});
                    }
                }
            }
            q.swap(q1);
        }
        return -1;
    }
};

到了这里,关于1263. 推箱子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++推箱子小游戏

    上代码: 由于写游戏时间较长,更新较慢,请大佬们理解一下

    2024年02月09日
    浏览(39)
  • Java课程设计之推箱子

      推箱子游戏是一个比较古老的游戏,深受广大游戏爱好者的欢迎,它在带来乐趣的同时也能培养我们的反应力以及严谨的思维能力。   游戏规则是要求角色将地图中所有放置的箱子推到指定目标位置,只有合理安排移动次序和位置 ,才能顺利完成任务。   项目任务是用

    2024年02月08日
    浏览(41)
  • 推箱子大冒险(SDL/C)

    欢迎来到小K的SDL专栏第三小节,本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解,这里也为大家上传了源码和图片资源,需要的自取看完以后,希望对你有所帮助 ✨效果如下 2023-05-26-14-19-21推箱子 ✨ 第一步 ,我们先用枚举把下图中的元素表示出来,分别为 空地、墙

    2024年02月06日
    浏览(33)
  • 使用Python语言写一个推箱子游戏

    本游戏旨在提供一个趣味性的益智游戏,玩家需要通过推动箱子到指定位置来过关。 玩家需要推动一个或多个箱子到指定位置,才能过关。 箱子只能向前推,不能拉回来。 箱子不允许被推到障碍物、墙壁或其他箱子上。 玩家可以通过 UNDO 按钮来撤回上一步操作,最多可以撤

    2024年02月05日
    浏览(51)
  • python小游戏——推箱子代码开源

    ♥️ 作者:小刘在这里 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。 目录 一.效果呈现  二.主代码 三.cfg 四.README \\\'\\\'\\\'配置文件\\\'\\\'\\\' imp

    2024年02月02日
    浏览(45)
  • java版本实现推箱子小游戏

    推方块 游戏简介: 由 ↑,↓,←,→键来控制方向,点击空格键表示重玩当前关卡。 核心代码部分 :就是如何处理人的移动和人和箱子一起时的移动,这里需要对人要走的下一步和人推着箱子一起走的下一步进行判断分析,如果没有被阻挡就可以继续走下一步。(有兴趣

    2024年02月11日
    浏览(53)
  • C/C++项目实战-推箱子小游戏

    2024年02月08日
    浏览(52)
  • 【HTML小游戏】推箱子网页版(附完整源码)

    最近刚刚更新完了HTML,CSS的万字总结 ,有很多人已经学习完了文章,感觉反馈还不错,今天,用HTML,CSS,JS的知识编写了一个童年经典游戏 - 推箱子,供学习参考。 游戏主界面展示: 游戏界面展示: 经典的推箱子是一个非常古老游戏,甚至是80,90年代的回忆,目的是在训

    2024年02月04日
    浏览(52)
  • python毕设分享 python推箱子小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月05日
    浏览(40)
  • Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏    工程地址:https://download.csdn.net/download/Highning0007/88098014

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包