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

    文章

    4611

    浏览量

    92867
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25943

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    鼎盛合 无刷电机涡轮增压暴力风扇方案

    酷热的夏天常常让人感到烦躁不安,而风扇作为一种便捷的消暑工具能够为人们带来一丝清凉。传统的有刷风扇在使用过程中存在着一些噪音大、寿命短、风力不够强劲等问题。为了解决这些问题,暴力无刷风扇应运而生。它
    的头像 发表于 11-11 15:57 516次阅读

    UHF RFID自适应射频干扰对消技术

    。针对目前有源干扰对消技术存在的抑制效果和实时性较差的缺点在分析有源干扰对消原理的基础上提出了基于改进Powell 搜索算法的自适应射频干扰对消方案。设计了有源对消电路通过改进的Powell 最优值搜索算法实现电路控制参数的自适应调节使电路工作在最优的抑制状态。测试结果表
    发表于 11-05 10:22 0次下载

    OpenAI推出ChatGPT搜索功能

    近日,OpenAI再次迈出了重要的一步,为其广受好评的ChatGPT平台添加了一项全新的搜索功能。 据悉,这项被命名为“ChatGPT搜索”的新功能,将为用户带来前所未有的搜索体验。以往,当用户需要
    的头像 发表于 11-04 10:34 340次阅读

    谷歌取消“站点链接搜索框”,适应新搜索需求

    近日,谷歌发布了一则通知,决定取消搜索结果中的“站点链接搜索框”。这一功能已经陪伴了用户十多年,它允许用户在特定网站上进行更深入的搜索,为许多网民提供了便利。然而,随着时代的变迁和技术的进步,这一
    的头像 发表于 10-23 11:20 337次阅读

    MS3142 马达驱动:电动积木益智游戏的创新动力

    在当今科技飞速发展的时代,电动积木益智游戏以其独特的魅力吸引着众多玩家,尤其是孩子们。而在这背后,MS3142 马达驱动发挥着至关重要的作用。接下来,让我们一同深入探索 MS3142 马达驱动在电动
    的头像 发表于 09-14 17:37 283次阅读

    电商搜索革命:大模型如何重塑购物体验?

    自我介绍:京东零售搜推算法算法工程师,专注于大模型技术以及在 AI 助手搜推等领域的应用探索和实践。在 AI 助手,NLP 和搜索领域有十多年研发实践经验,在 AI/NLP 领域申请超过 15
    的头像 发表于 08-19 15:09 277次阅读

    揭秘电动机与供电线路漏电“克星

    煤矿井下,一探那些默默守护着矿工生命安全的“隐形卫士”——绝缘监测仪,以及它们如何成为漏电故障的“克星”。 煤矿井下,黑暗与潮湿并存,每一次的开采都伴随着未知的风险。电动机,作为井下设备的动力源泉,其稳定运
    的头像 发表于 07-26 09:17 255次阅读
    揭秘电动机与供电线路漏电“<b class='flag-5'>克星</b>”

    基于 FPGA 的飞机大战游戏系统设计

    第一部分 设计概述1.1 设计目的我们设计了一款基于 FPGA 的SEA开发板 的飞机大战游戏。飞机大战游戏是一款休闲益智游戏,既简单又耐玩。在初始界面,我们有开始
    发表于 07-24 20:03

    仁懋MOSFET:驱动13万转暴力风扇无刷电机的隐形力量

    仁懋MOSFET驱动13万转暴力风扇无刷电机应用炎炎夏日,一款性能卓越、风力强劲的户外暴力风扇无疑是消暑利器。而在这背后,仁懋电子的MOSFET产品以其卓越的性能和稳定性,成为了这些高性能风扇
    的头像 发表于 07-18 08:37 701次阅读
    仁懋MOSFET:驱动13万转<b class='flag-5'>暴力</b>风扇无刷电机的隐形力量

    网红爆款涡轮风扇13万转无刷电机手持高速暴力风扇方案32位单片机

    夏日炎炎,市面上一些普通的手持风扇已经不能满足人们需求,因而便有了暴力风扇的出世。泛海微一款低成本的暴力无刷风扇方案,集成无刷电机驱动、电池低压保护等功能的同时,保持较低的待机功耗。泛海微推出网红爆
    的头像 发表于 06-22 18:41 1014次阅读
    网红爆款涡轮风扇13万转无刷电机手持高速<b class='flag-5'>暴力</b>风扇方案32位单片机

    揭秘谷歌搜索算法工作原理,与官方声明存在矛盾

    有着十多年搜索引擎优化经验的兰德·菲什金,近日透露他收到一份长达2500页的文件,据称这是对谷歌搜索算法工作原理的真实揭示,而非谷歌官方所声称的那样。
    的头像 发表于 05-29 16:00 601次阅读

    HarmonyOS开发实战:【亲子拼图游戏

    编程语言编写的一个分布式益智拼图游戏,可以两台设备同时开启一局拼图游戏,每次点击九宫格内的图片,都会同步更新两台设备的图片位置
    的头像 发表于 04-16 17:00 582次阅读
    HarmonyOS开发实战:【亲子拼图<b class='flag-5'>游戏</b>】

    智己汽车依法指控网络暴力和流量霸凌

    投诉信爆料,自2024年4月9日以来,智己汽车遭遇有组织的网络暴力和流量霸凌,直接影响到企业的正常经营和声誉。智己汽车据此向国家相关主管部门提出实名举报,请求按照中央网信办2024年“清朗”系列专项整治活动的要求,严肃处理这一恶劣的网络暴力行为。
    的头像 发表于 04-11 16:45 638次阅读

    鸿蒙OS开发之 融合搜索概述

    HarmonyOS 融合搜索为开发者提供搜索引擎级的全文搜索能力,可支持应用内搜索和系统全局搜索,为用户提供更加准确、高效的
    的头像 发表于 01-29 16:24 570次阅读
    鸿蒙OS开发之  融合<b class='flag-5'>搜索</b>概述