【3维BFS】个人练习-Leetcode-LCP 79. 提取咒文

news/2024/7/8 12:17:49 标签: 宽度优先, leetcode, 算法

题目链接:https://leetcode.cn/problems/kjpLFZ/

题目大意:给一个矩阵matrix[][],元素为小写英文字母。给一个字符串mantra,求从矩阵的(0,0)位置开始,可以移动(上下左右)或者提取字母,求组成字符串的最小【移动+提取次数】

思路:显然是BFS,然而BFS无法保证结果“最小”。一个例子就是,如果要找speed这个词,然而矩阵第一行是speeabd,第一列是speedxxx,那么如果在BFS时先按行找,就会陷入陷阱,因为明显按列找才是最短的。

看了题解才知道有一种“3维BFS”的存在。类似于一个魔方,在每一层进行BFS,上面一层满足了条件(找到下一个字母)后才能往下一层转移。转移了并不会终止上一层的BFS,这样就避免了遗漏可能的最小的其他路径。

并且还学到了新的【上下左右偏移】的写法,只用到一个长为5的一维数组dir就行。

完整代码

class Solution {
public:
    int extractMantra(vector<string>& matrix, string mantra) {
        int n = matrix.size(), m = matrix[0].length(), k = mantra.length();
        bool known[101][101][101] = {};
        const int dir[] = {0, 1, 0, -1, 0};
        queue<tuple<char, char, char>> q;
        q.emplace(0, 0, 0);
        known[0][0][0] = true;
        int ans = 0;
        while (!q.empty()) {
            for (int i = q.size(); i > 0; i--) {
                auto x = get<0>(q.front());
                auto y = get<1>(q.front());
                auto z = get<2>(q.front());
                q.pop();

                if (z == k)
                    return ans;
                
                if (mantra[z] == matrix[x][y] && !known[x][y][z+1]) {
                    q.emplace(x, y, z+1);
                    known[x][y][z+1] = true;
                    continue;
                }

                for (int j = 0; j < 4; j++) {
                    auto tx = x + dir[j];
                    auto ty = y + dir[j+1];
                    if (tx >= 0 && tx < n && ty >= 0 && ty < m && !known[tx][ty][z]) {
                        q.emplace(tx, ty, z);
                        known[tx][ty][z] = true;
                    }
                }
            }
            ans++;
        }   
        return -1;
    }
};

http://www.niftyadmin.cn/n/5537210.html

相关文章

使用deep修改前端框架中的样式

目录 1.deep的作用 2.使用方式 3.特别说明 scoped 的实现原理&#xff1a; !important 1.deep的作用 /deep/、::v-deep 和 :deep 都是用于穿透组件作用域的选择器。它们的主要目的是允许开发者在父组件中直接选择并样式化子组件内部的元素&#xff0c;即使这些元素被封装在…

数据分析入门指南:从基础概念到实际应用(一)

随着数字化时代的来临&#xff0c;数据分析在企业的日常运营中扮演着越来越重要的角色。从感知型企业到数据应用系统的演进&#xff0c;数据驱动的业务、智能优化的业务以及数智化转型成为了企业追求的目标。在这一过程中&#xff0c;数据分析不仅是技术的运用&#xff0c;更是…

深入浅出3D感知中的优化与基于学习的技术1(原创系列)

近期几乎看了所有有关NERF技术论文&#xff0c;本身我研究的领域不在深度学习技术方向&#xff0c;是传统的机器人控制和感知。所以总结了下这部分基于学习的感知技术&#xff0c;会写一个新的系列教程讲解这部分三维感知技术的发展到最新的技术细节&#xff0c;并支持自己最近…

AirPods“窃听门”曝光,苹果紧急修复重大安全漏洞

近日&#xff0c;苹果公司发布了AirPods的固件更新&#xff0c;但此次更新版本存在一个严重的安全漏洞&#xff0c;编号为CVE-2024-27867。这个漏洞可能使恶意行为者以未经授权的方式访问耳机。此漏洞影响广泛&#xff0c;包括AirPods第二代及其后续版本、所有型号的AirPods Pr…

2024 最新docker仓库镜像,6月,7月

目前下面的docker仓库镜像源还能使用。 vi /etc/docker/daemon.json添加如下配置{"registry-mirrors": ["https://hub.uuuadc.top", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu&…

使用css,让div消失在视野中的方法

使用css&#xff0c;让div消失在视野中的方法 display: none;visibility: hidden;opacity:0;通过定位隐藏元素通过margin隐藏元素 display: none; display:none是彻底消失&#xff0c;不在文档流中占位&#xff0c;浏览器也不会解析该元素&#xff1b; 如果给一个元素设置了d…

基于Java的壁纸网站设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

vue项目 js发布订阅

/*** 事件管理器* ** *单例模式singleton* 通用的事件管理工具&#xff0c;可以处理各种事件触发和回调。** 1. 事件根据topic 分类。* 2. 主题&#xff1a;即topic 。* 3. 内部将所有的事件按照topic 为key、事件回调函数为value 的map 来存储。* 4. subscribe: 订阅某事件。*…