首页 > 其他分享 >1263. 推箱子

1263. 推箱子

时间:2023-05-08 20:22:49浏览次数:62  
标签:箱子 sy sx vis 1263 bi bj int

题目链接:1263. 推箱子

方法:双端队列 + BFS

解题思路

[Python3/Java/C++/Go/TypeScript] 一题一解:双端队列 BFS(清晰题解)

代码

class Solution {
public:
    int minPushBox(vector<vector<char>>& grid) {
        int m = grid.size(), n = grid[0].size();
        int si, sj, bi, bj;
        for (int i = 0; i < m; i ++ ) { // 获取起点信息
            for (int j = 0; j < n; j ++ ) {
                if (grid[i][j] == 'S') {
                    si = i, sj = j;
                } else if (grid[i][j] == 'B') {
                    bi = i, bj = j;
                }
            }
        }
        auto f = [&](int i, int j) {
            return i * n + j; // 二维数对映射到一维
        };
        auto check = [&](int i, int j) {
            return i >= 0 && i < m && j >=0 && j < n && grid[i][j] != '#'; // 检查位置是否合法
        };
        int dirs[5] = {-1, 0, 1, 0, -1}; // 下一步走法(dirs[i], dirs[i + 1])
        deque<tuple<int, int, int>> q; // 三元组:人位置,石头位置,当前石头移动的最短次数
        q.emplace_back(f(si, sj), f(bi, bj), 0); // 初始化双端队列
        bool vis[m * n][m * n]; memset(vis, false, sizeof(vis));
        vis[f(si, sj)][f(bi, bj)] = true;
        while (!q.empty()) {
            auto [s, b, d] = q.front();
            q.pop_front();
            si = s / n, sj = s % n;
            bi = b / n, bj = b % n;
            if (grid[bi][bj] == 'T') return d;
            for (int k = 0; k < 4; k ++ ) { // 枚举下一步
                int sx = si + dirs[k], sy = sj + dirs[k + 1];
                if (!check(sx, sy)) continue;
                if (sx == bi && sy == bj) {
                    int bx = bi + dirs[k], by = bj + dirs[k + 1];
                    if (!check(bx, by) || vis[f(sx, sy)][f(bx, by)]) continue;
                    vis[f(sx, sy)][f(bx, by)] = true;
                    q.emplace_back(f(sx, sy), f(bx, by), d + 1); // 推动箱子,d + 1,进入下一层,加入队尾
                } else if (!vis[f(sx, sy)][f(bi, bj)]) {
                    vis[f(sx, sy)][f(bi, bj)] = true;
                    q.emplace_front(f(sx, sy), f(bi, bj), d); // 没有推动箱子,d,处于本层,加入队首
                }
            }
        }
        return -1;
    }
};

标签:箱子,sy,sx,vis,1263,bi,bj,int
From: https://www.cnblogs.com/lxycoding/p/17382998.html

相关文章

  • JavaScript写一个小乌龟推箱子游戏
    推箱子游戏是老游戏了,网上有各种各样的版本,说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例;推箱子游戏的在线DEMO:打开如下是效果图:这个拖箱子游戏做了移动端的适配,我使用了zepto的touch模块,通过手指滑动屏幕就可以控制乌龟走不同的方向;因为推箱......
  • 苹果反间谍趣闻:曾把产品放在番茄箱子里运输
    虽然每次苹果推出新产品之前总是流言满天飞,但并不代表苹果在保密措施上不上心,相反地,苹果对于供应商方面泄露信息地担心已经到神经质的地步。甚至曾经用为未作特殊标记番茄箱子运送产品。当然,这不是另一个瞎扯的流言,这是由BusinessWeek的 PeterBurrows和AdamSatariano报道......
  • PLSQL出现ORA-12638:身份证明检索失败
    新安装的plsql链接远程数据库一直链接不上提示身份证明检索失败  解决方法:第一种:找到Oracle的安装目录下的sqlnet.ora文件如果存在SQLNET.AUTHENTICATION_SERVIC......
  • 【Android开发】范例4-猜猜宝石放在哪个箱子里
    实现"猜猜宝石放在哪个箱子"的小游戏:主界面中有三个箱子,单击其中任意一个箱子,将打开箱子,显示里面是否有宝石,并且将没有被单击的箱子设为半透明显示,被......
  • CouchDB 漏洞复现 CVE-2017-12635/12636
    前言CouchDB是一个开源的面向文档的数据库管理系统,可以通过RESTfulJavaScriptObjectNotation (JSON)API 访问。CVE-2017-12635是由于Erlang和JavaScript对JSON解......
  • XSS跨站之订单及shell箱子反杀记
    XSS平台及工具使用postman可以通过获取的cookie登陆网站的后台beef工具必须在linux中才可以使用XSS经典应用案例测试Webshell后门中的后门箱子返回的代码中添加后门,......
  • H5 推箱子之送行者
    开始做的时候还挺接地气的.........
  • #yyds干货盘点# LeetCode程序员面试金典:堆箱子
    题目:堆箱子。给你一堆n个箱子,箱子宽wi、深di、高hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆......
  • 基于EasyX和Raylib的推箱子
    基于EasyX//根据《C和C++游戏趣味编程》第九章推箱子写出#include<graphics.h>#include<conio.h>//_kbhit()#include<stdio.h>#include<stdlib.h>//玩......
  • ORACLE ORA-12638:身份证明检索失败
    使用PLSQL连接远程数据库时,有时候会遇到提示ORA-12638:身份证明检索失败的问题,怎么办呢?有两种方法,选择一种更改就行了,网络上大多是第一种方法,如果已经找过不是你想要的答案,......