力扣773. 滑动谜题(BFS)

Problem: 773. 滑动谜题

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路

由于题目提到最小步数,则可以使用BFS来穷举出最小的结果

1.转换为BFS问题:由于0代表空着的可以移动的位置,所以我们只需要从当前位置和0的相邻位置移动从而转换出其它的可能的状态(这样也在逻辑上构成了一棵多叉树
2.压缩二维数组,并标记出相邻索引:我们可以将二维数组board压缩,当在BFS遍历查找时找到一种状态等于压缩后的情况时,我们则立即返回此时的步数;但是我们为了解决相邻索引的问题,需要直接将这个映射写出来:在一维字符串中,索引i在二维数组中的的相邻索引为neighbor[i]
image.png

解题方法

1.将题目所给的初始board压缩为字符串;
2.记录一维字符串的相邻索引(如下代码;按顺势针);
3.BFS框架书写:

3.1.用一个无序表记录已经走过的状态(防止重复甚至出现死循环);
3.2每次取出当前的状态,并匹配是否和目标target一致,一致则返回所需的步数(步数用一个变量step记录);
3.3.每次找到当前数字0的索引并与其相邻的数字交换位置,同时要在无序表中判断是否已经存在;

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
public:/*** BFS* * @param board Given array* @return int*/int slidingPuzzle(vector<vector<int>> &board) {int row = 2;int col = 3;string start = "";string target = "123450";// Converts the 2x3 array to a stringfor (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {start.push_back(board[i][j] + '0');}}// Records the adjacent index of a one-dimensional stringvector<vector<int>> neighbor = {{1, 3},{0, 4, 2},{1, 5},{0, 4},{3, 1, 5},{4, 2}};//BFSqueue <string> q;unordered_set<string> visited;q.push(start);visited.insert(start);int step = 0;while (!q.empty()) {int sz = q.size();for (int i = 0; i < sz; ++i) {string cur = q.front();q.pop();// Determine whether the target situation has been reachedif (target == cur) {return step;}// Find the index of the number 0int index = 0;for (; cur[index] != '0'; ++index);// Switch the position of the digit 0 or any adjacent digitfor (int adj: neighbor[index]) {string new_board = cur;swap(new_board[adj], new_board[index]);// Prevent backtrackingif (!visited.count(new_board)) {q.push(new_board);visited.insert(new_board);}}}step++;}return -1;}
};

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

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

相关文章

代码随想录刷题笔记-Day20

1. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#x…

ARM体系在linux中的中断抢占

上一篇说到系统调用等异常通过向量el1_sync做处理&#xff0c;中断通过向量el1_irq做处理&#xff0c;然后gic的工作都是为中断处理服务&#xff0c;在rtos中&#xff0c;我们一般都会有中断嵌套和优先级反转的概念&#xff0c;但是在linux中&#xff0c;中断是否会被其他中断抢…

Cannot invoke “java.sql.Connection.prepareStatement(String)“ because “conn“

下载sqlite-jdbc&#xff0c;放在目录下&#xff0c;然后IDEA右键jar文件选择“加入库”即可解决 Central Repository: org/xerial/sqlite-jdbc/3.36.0.1

JavaScript 的location 对象API 介绍

JavaScript 中&#xff0c;location 对象提供了访问当前页面 URL 相关信息的属性和方法。通过 location 对象&#xff0c;我们可以获取当前页面的 URL、查询参数、锚点等信息&#xff0c;并且可以使用 JavaScript 来修改当前页面的 URL。 以下是一些 location 对象的常用属性和…

设计模式二:代理模式

1、什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候&#xff0c;或者是在面试过程中被问到动态代理的时候&#xff0c;不能很好的描述出来&#xff0c;动态代理到底是个什么高大上的技术。不方&#xff0c;其实动态代理的使用非常广泛&#xff0c;例如我们平常使…

学习求余

题目描述 白浅妹妹今天学习了求余运算&#xff0c;她很好奇求余运算和乘法运算结合起来会是什么样子&#xff0c;于是她设计了这样一道题目。 给定数字 n&#xff0c;你可以任选一个数字 k(1 ≤ k ≤ n)&#xff0c;然后计算出 n%k 的值(其中% 为求余运算)&#xff0c;记为 q…

php伪协议之phar

一.phar协议 用于将多个 PHP 文件、类、库、资源&#xff08;如图像、样式表&#xff09;等打包成一个单独的文件。这个归档文件可以像其他 PHP 文件一样被包含&#xff08;include&#xff09;或执行。PHAR 归档提供了一种方便的方式来分发和安装 PHP 应用程序和库&#xff0c…

【RT-DETR有效改进】可变形大核注意力 | Deformable-LKA适用于复杂背景或不同光照场景

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进内容是Deformable-LKA(可变形大核注意力)。Deformable-LKA结合了大卷积核的广阔感受野和可变形卷积的灵活性,有效地处理复杂的视觉信息。这一机制通过动态调整卷积核的形状和大小来适…

Sui主网升级至V1.18.1版本

Sui主网现已升级至V1.18.1版本&#xff0c;同时Sui协议升级至36版本。其他升级要点如下所示&#xff1a; #15794 解析错误不再停止编译&#xff0c;并且后续编译阶段的诊断信息也可能包含在编译结果中&#xff0c;所以开发者可能会看到比以前更多的编译器诊断信息。 #12337 …

蓝桥杯嵌入式STM32G431RBT6知识点(主观题部分)

目录 1 前置准备 1.1 Keil 1.1.1 编译器版本及微库 1.1.2 添加官方提供的LCD及I2C文件 1.2 CubeMX 1.2.1 时钟树 1.2.2 其他 1.2.3 明确CubeMX路径&#xff0c;放置芯片包 2 GPIO 2.1 实验1&#xff1a;LED1-LED8循环亮灭 ​编辑 2.2 实验2&#xff1a…

MySQL篇之MVCC

一、什么是MVCC 全称 Multi-Version Concurrency Control&#xff0c;多版本并发控制。指维护一个数据的多个版本&#xff0c;使得读写操作没有冲突。 事务5查询的记录是哪个事务版本的记录呢&#xff1f;MVCC的具体实现&#xff0c;主要依赖于数据库记录中的隐式字段、undo lo…

Redis典型应用之缓存

目录 前言 关于“二八定律” 使用Redis作为缓存 为什么关系型数据库性能不高 为什么并发量高了就爱宕机 缓存更新策略 定期生成&#xff1a; 实时生成&#xff1a; 淘汰策略 FIFO(First In First Out) 先进先出 lRU(Least Recently Used) 淘汰最久未使用的 LFU(L…