力扣— 滑动谜题

文章目录

  • 力扣--- 滑动谜题
    • 一、题目描述
    • 二、问题分析
    • 三、代码

一、题目描述


二、问题分析

对于这种计算 最小步数的问题,我们就要敏感地想到 BFS 算法。

这个题目转化成 BFS 问题是有一些技巧的,我们面临如下问题:

  • 1、一般的 BFS算法,是从一个起点start开始,向终点target进行寻路,但是拼图问题不是在寻路,而是在不断交换数字,这应该怎么转化成 BFS算法问题呢?
  • 2、即便这个问题能够转化成 BFS 问题,如何处理起点start和终点target?它们都是数组哎,把数组放进队列,套 BFS框架,想想就比较麻烦且低效
  • 首先回答第一个问题,BFS 算法并不只是一个寻路算法,而是一种暴力搜索算法,只要涉及暴力穷举的问题,BFS就可以用,而且可以最快地找到答案
  • 你想想计算机怎么解决问题的?哪有那么多奇技淫巧,本质上就是把所有可行解暴力穷举出来,然后从中找到一个最优解罢了。
  • 明白了这个道理,我们的问题就转化成了:如何穷举出board当前局面下可能衍生出的所有局面?这就简单了,看数字 0 的位置呗,和上下左右的数字进行交换就行了:

  • 这样其实就是一个 BFS 问题,每次先找到数字 0,然后和周围的数字进行交换,形成新的局面加入队列……当第一次到达target时,就得到了赢得游戏的最少步数
  • 对于第二个问题,我们这里的board仅仅是 2x3 的二维数组,所以可以压缩成一个一维字符串。其中比较有技巧性的点在于,二维数组有「上下左右」的概念,压缩成一维后,如何得到某一个索引上下左右的索引

很简单,我们只要手动写出来这个映射就行了:

vector<vector<int>> neighbor = {{ 1, 3 },{ 0, 4, 2 },{ 1, 5 },{ 0, 4 },{ 3, 1, 5 },{ 4, 2 }
};

这个含义就是,在一维字符串中,索引i在二维数组中的的相邻索引为neighbor[i]

三、代码

至此,我们就把这个问题完全转化成标准的 BFS 问题了,借助之前 BFS 算法框架套路详解 的代码框架(算法模块的博客),直接就可以套出解法代码了:

int slidingPuzzle(vector<vector<int>>& board) {int m = 2, n = 3;string start = "";string target = "123450";// 将 2x3 的数组转化成字符串for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {start.push_back(board[i][j] + '0');}}// 记录一维字符串的相邻索引vector<vector<int>> neighbor = {{ 1, 3 },{ 0, 4, 2 },{ 1, 5 },{ 0, 4 },{ 3, 1, 5 },{ 4, 2 }};/******* BFS 算法框架开始 *******/queue<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();// 判断是否达到目标局面if (target == cur) {return step;}// 找到数字 0 的索引int idx = 0;for (; cur[idx] != '0'; idx++);// 将数字 0 和相邻的数字交换位置for (int adj : neighbor[idx]) {string new_board = cur;swap(new_board[adj], new_board[idx]);// 防止走回头路if (!visited.count(new_board)) {q.push(new_board);visited.insert(new_board);}}}step++;}return -1;/******* BFS 算法框架结束 *******/
}

至此,这道题目就解决了,其实框架完全没有变,套路都是一样的,我们只是花了比较多的时间将滑动拼图游戏转化成 BFS 算法。

力扣--- 滑动谜题相关推荐

  1. 双指针算法之滑动窗口 | 力扣76.最小覆盖字串

    本文讲解力扣76.最小覆盖字串问题 主要用到的是滑动窗口的思想 目录 76.最小覆盖字串 题目: 分析: 步骤描述: 复杂度分析: 结果 76.最小覆盖字串 题目: 给定字符串 S 以及字符串 T , ...

  2. 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)

    一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...

  3. Leetcode 773. 滑动谜题 C++

    Leetcode 773. 滑动谜题 题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上 ...

  4. 力扣(LeetCode)刷题,简单+中等题(第32期)

    目录 第1题:数组的度 第2题:托普利茨矩阵 第3题:爱生气的书店老板 第4题:翻转图像 第5题:有效的数独 第6题:无重复字符的最长子串 第7题:区域和检索 - 数组不可变 第8题:二维区域和检索 ...

  5. 力扣(LeetCode)刷题,简单+中等题(第31期)

    目录 第1题:同构字符串 第2题:最后一块石头的重量 第3题:最小路径和 第4题:键盘行 第5题:存在重复元素 II 第6题:两数相加 第7题:三个数的最大乘积 第8题:等价多米诺骨牌对的数量 第9题 ...

  6. 力扣(LeetCode)刷题,简单题(第6期)

    目录 第1题:在排序数组中查找数字 第2题:0~n-1中缺失的数 第3题:反转单次顺序 第4题:和为S的两个数 第5题:和为S的连续正数序列 第6题:左旋转字符串 第7题:滑动窗口的最大值 第8题:扑 ...

  7. 《LeetCode力扣练习》第3题 C语言版 (做出来就行,别问我效率。。。。)

    库你急哇,哈集美马戏特~~ 第一眼看这题的反应,(我以前做过这个题好几遍了).再看一眼之后发现,(什么?我什么时候做过这个题?) 题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 ...

  8. 1024,给大家谈谈如何搞透刷题 玩转力扣!

    前言 大家好,我是bigsai,好久不见!今天1024,祝大家程序员节快乐,写代码永没bug!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强! 最近在一些 ...

  9. 力扣--替换后的最长重复字符

    力扣–替换后的最长重复字符 文章目录 力扣--替换后的最长重复字符 一.题目描述 二.分析 三.代码 一.题目描述 二.分析 题目的意思比较清楚,不过可能的情况有很多,不可能用代码去寻找最佳的替换位置 ...

最新文章

  1. grub shell 错误_GRUB启动故障排除和内核编译
  2. 【C++多线程系列】【四】将类的成员函数作为线程启动函数
  3. Eclipse安装Perl插件
  4. CF1406D:Three Sequences(贪心、构造)
  5. 探索Java日志的奥秘:底层日志系统-log4j2
  6. 盐城哪里学计算机表格,盐城办公自动化周末班
  7. HTML(超文本标记语言)-----WEB开发基础之二
  8. 电商生鲜网站开发(接口文档)
  9. c语言中的单词的意思及作用,c语言入门必背单词 具体含义是什么
  10. JLINK仿真器与ST-LINK仿真器的安装与配置.pdf
  11. 看到大一的PS作业,忍不住想吐槽!!
  12. Ajax请求传递中文参数
  13. 第11届蓝桥杯青少组C++选拔赛真题
  14. python学习 复制图片并重命名
  15. 微信公众号推广技巧之一
  16. 住院管理系统数据库课程设计
  17. Samba实现Linux与windows文件共享
  18. 如何在金山云上部署高可用Oracle数据库服务
  19. 计算机网络MTU什么意思,三招使你的网速加速-mtu值怎么设置
  20. ue4 android 虚拟按钮,ue4 创建Android和ios ar应用

热门文章

  1. python2与python3共存_【python】--python2与python3 共存
  2. 关于汽车领域的知识图谱实战入门
  3. sq语句报错Parameter index out of range (2 > number of parameters, which is 1).
  4. SAS实现四十年连续增长,2015年全球营收达31.6亿美元
  5. 文本右上角右下角添加文本
  6. ifconfig命令无法找到,提示bash: ifconfig: command not found
  7. python交互模式设置及VIM的tab补齐
  8. 牛逼站是怎样炼成的?-推荐系统篇
  9. Parse a document from a String
  10. Linux版本之挑选适合服务器的OS发行版