0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

益智游戏克星:BFS暴力搜索算法

算法与数据结构 来源:算法与数据结构 2020-08-03 16:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

滑动拼图游戏大家应该都玩过,下图是一个 4x4 的滑动拼图:

拼图中有一个格子是空的,可以利用这个空着的格子移动其他数字。你需要通过移动这些数字,得到某个特定排列顺序,这样就算赢了。

我小时候还玩过一款叫做「华容道」的益智游戏,也和滑动拼图比较类似:

那么这种游戏怎么玩呢?我记得是有一些套路的,类似于魔方还原公式。但是我们今天不来研究让人头秃的技巧,这些益智游戏通通可以用暴力搜索算法解决,所以今天我们就学以致用,用 BFS 算法框架来秒杀这些游戏。

一、题目解析

LeetCode 第 773 题就是滑动拼图问题,题目的意思如下:

给你一个 2x3 的滑动拼图,用一个 2x3 的数组board表示。拼图中有数字 0~5 六个数,其中数字 0 就表示那个空着的格子,你可以移动其中的数字,当board变为[[1,2,3],[4,5,0]]时,赢得游戏。

请你写一个算法,计算赢得游戏需要的最少移动次数,如果不能赢得游戏,返回 -1。

比如说输入的二维数组board = [[4,1,2],[5,0,3]],算法应该返回 5:

如果输入的是board = [[1,2,3],[4,0,5]],则算法返回 -1,因为这种局面下无论如何都不能赢得游戏。

二、思路分析

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

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

1、一般的 BFS 算法,是从一个起点start开始,向终点target进行寻路,但是拼图问题不是在寻路,而是在不断交换数字,这应该怎么转化成 BFS 算法问题呢?

2、即便这个问题能够转化成 BFS 问题,如何处理起点start和终点target?它们都是数组哎,把数组放进队列,套 BFS 框架,想想就比较麻烦且低效。

首先回答第一个问题,BFS 算法并不只是一个寻路算法,而是一种暴力搜索算法,只要涉及暴力穷举的问题,BFS 就可以用,而且可以最快地找到答案。

你想想计算机怎么解决问题的?哪有那么多奇技淫巧,本质上就是把所有可行解暴力穷举出来,然后从中找到一个最优解罢了。

明白了这个道理,我们的问题就转化成了:如何穷举出board当前局面下可能衍生出的所有局面?这就简单了,看数字 0 的位置呗,和上下左右的数字进行交换就行了:

这样其实就是一个 BFS 问题,每次先找到数字 0,然后和周围的数字进行交换,形成新的局面加入队列…… 当第一次到达target时,就得到了赢得游戏的最少步数。

对于第二个问题,我们这里的board仅仅是 2x3 的二维数组,所以可以压缩成一个一维字符串。其中比较有技巧性的点在于,二维数组有「上下左右」的概念,压缩成一维后,如何得到某一个索引上下左右的索引?

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

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

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

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

intslidingPuzzle(vector>&board){ intm=2,n=3; stringstart=""; stringtarget="123450"; //将2x3的数组转化成字符串 for(inti=0;i< m; i++) {         for (int j = 0; j < n; j++) {             start.push_back(board[i][j] + '0');         }     }     // 记录一维字符串的相邻索引     vector>neighbor={ {1,3}, {0,4,2}, {1,5}, {0,4}, {3,1,5}, {4,2} }; /*******BFS算法框架开始*******/ queueq; unordered_setvisited; q.push(start); visited.insert(start); intstep=0; while(!q.empty()){ intsz=q.size(); for(inti=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 算法。

很多益智游戏都是这样,虽然看起来特别巧妙,但都架不住暴力穷举,常用的算法就是回溯算法或者 BFS 算法,感兴趣的话我们以后再聊。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4761

    浏览量

    97147
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

原文标题:益智游戏克星:BFS暴力搜索算法

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    线性搜索与二分搜索介绍

    搜索算法搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
    发表于 12-01 07:36

    京东拍立淘API开发指南:从零开始构建图像搜索应用

    京东图片识别搜索API(拍立淘)是基于深度学习的视觉搜索服务,通过卷积神经网络提取图像特征向量,结合近似最近邻搜索算法实现商品精准匹配‌。该技术解决了传统文字搜索难以描述商品外观的痛点
    的头像 发表于 11-09 17:40 1950次阅读

    模数转换器主要类型有哪些

    模数转换器采用逐步比较逼近策略,通过二进制搜索算法将模拟信号转换为数字值。这类转换器在转换速度和精度之间实现了良好平衡,广泛应用于中等采样速率和中等精度的场景,如工业控制系统和医疗仪器。
    的头像 发表于 11-03 16:36 447次阅读

    益智造:人形机器人业务已产生收入

    10月23日领益智造在互动平台透露;人形机器人业务已经产生收入;目前已获得海内外机器人客户的硬件订单,包括有零部件、灵巧手、关节模组、整机组装等。但并未透露海外具体的客户名称,以及具体的订单金额
    的头像 发表于 10-23 11:29 1061次阅读

    微店关键词搜索接口核心突破:动态权重算法与语义引擎的实战落地

    本文详解微店搜索接口从基础匹配到智能推荐的技术进阶路径,涵盖动态权重、语义理解与行为闭环三大创新,助力商家提升搜索转化率、商品曝光与用户留存,实现技术驱动的业绩增长。
    的头像 发表于 10-15 14:38 231次阅读

    用拼多多 API 实现拼多多店铺商品搜索权重提升

    将分步讲解如何利用 API 实现这一目标,确保内容真实可靠。 1. 理解搜索权重及其重要性 搜索权重是平台算法对商品排名的综合评分,基于多个因素计算。例如: 关键词相关性:商品标题和描述与用户
    的头像 发表于 08-19 17:23 518次阅读
    用拼多多 API 实现拼多多店铺商品<b class='flag-5'>搜索</b>权重提升

    仁懋MOS:暴力风扇高效运转的幕后功臣

    暴力风扇的世界里,每一次强劲风力的输出,都离不开众多精密器件的协同工作。而仁懋电子的MOSFET(金属氧化物半导体场效应晶体管),凭借其出色的性能,成为了暴力风扇产品的关键选择。下面,就为大家带来
    的头像 发表于 07-24 17:43 691次阅读
    仁懋MOS:<b class='flag-5'>暴力</b>风扇高效运转的幕后功臣

    【HarmonyOS next】ArkUI-X休闲益智连连看【进阶】

    ;: 统一UI描述:ArkTS声明式语法在双端生成原生UI组件 共享核心逻辑:TypeScript编写的游戏算法(如BFS路径搜索)直接复用 原生渲染引擎:各平台使用系统原生渲染管线(
    发表于 06-28 21:51

    【HarmonyOS next】ArkUI-X休闲益智猜字谜【基础】

    下图是在iOS中的运行效果 下图是在HarmonyOS中的运行效果 今天咱们来聊聊如何用ArkUI-X这个新兴框架实现跨端开发,通过一个猜字谜小游戏带大家感受它的开发魅力。本文不仅能让你看到
    发表于 06-26 20:01

    笙泉高转速暴力风扇控制方案(MDF101A)登场

    本帖最后由 noctor 于 2025-5-21 10:32 编辑 笙泉高转速\"暴力风扇\"控制方案(MDF101A)登场 手持暴力风扇需求稳定成长 随着全球气温
    发表于 05-20 15:32

    百度搜索与文心智能体平台接入DeepSeek及文心大模型深度搜索

    够免费使用DeepSeek和文心大模型的深度搜索功能。这一功能不仅融合了先进的搜索算法,还借助文心大模型的强大能力,实现了对信息的深度挖掘和精准匹配。用户在进行搜索时,将能够获得更加全面、准确的结果,满足多样化的需求。 同时,文
    的头像 发表于 02-17 09:14 974次阅读

    益智造与XREAL合作,深耕XR产业

    近日,领益智造在互动平台上明确表示,公司在XR(扩展现实)产业领域已深耕多年,专注于为AR(增强现实)、VR(虚拟现实)、MR(混合现实)等智能穿戴设备提供核心组件和技术支持。作为该领域的佼佼者,领
    的头像 发表于 01-14 10:19 1882次阅读

    基于PY32MD310单片机开发的11万转强力涡轮暴力风扇方案介绍

    今天给大家介绍下我们的11万转高速暴力风扇方案,搭载了11万转高性能无刷电机、采用独特旋钮设计产出更大风力。暴力风扇在日常生活中有着很好的应用。可以用做一些电子产品清灰,宠物毛发吹干,除尘助燃等
    的头像 发表于 01-02 17:52 1589次阅读

    算法到生命,自动化人工生命搜索已然显现?

    」像生命体一样运作。 ASAL 其中一位研究者 Phillip Isola 近日,Sakana AI团队携手麻省理工学院(MIT)、开放人工智能研究院(OpenAI)以及瑞士AI实验室IDSIA等机构研究人员,共同提出了“自动化人工生命搜索”(ASAL)的新算法。 尤其,
    的头像 发表于 12-31 10:54 783次阅读
    从<b class='flag-5'>算法</b>到生命,自动化人工生命<b class='flag-5'>搜索</b>已然显现?

    ChatGPT新增实时搜索与高级语音功能

    。OpenAI对搜索算法进行了深度优化,使得ChatGPT能够在用户提出问题后,迅速获取到分钟级别的最新信息,包括股票、新闻等。这一功能的加入,极大地满足了用户对即时数据的需求,使得ChatGPT在各类应用场景中更加得心应手。 同时,ChatGPT还推出了高级语音功能。在高级语
    的头像 发表于 12-17 14:08 922次阅读