滑动谜题 leetcode的BFS题目 启发如何写一个拼图编程呢

题目链接

在这里插入图片描述
题目要求,要将上面的拼板拼成123450

首先,转换为字符串,为什么要转换为字符串呢,因为处理会变得很简单比如示例一,转化为字符串是12345,目标字符串为123450,只需要证明通过某种交换,可不可以得到目标字符串。

那么如何处理交换呢?观察可以发现,假设0在右下角,那么可以向上,和向左交换;假设0在左上角,那么可以向右,向下交换。总结:0在不同的位置,可以有不同的交换方式,我们要把这种交换方式转到字符串处理里面。

如何做到:二维转一维
首先要知道,如何转成字符串,下面是代码:

        string init;//初始字符串for(int i = 0; i < 2; ++i){for(int j = 0; j < 3; ++j){init += char(board[i][j] + '0');//注意}}

board[0][0] 是字符串的第一个(坐标为0)
board[0][1] 是字符串的第二个(坐标为1)

board[1][0] 为字符串的四个(坐标是3)
规律为i * 3 + j = 字符串的某个字符的坐标

在这里插入图片描述
上图,是拼板对应字符串的坐标

综上,字符串中,下标为0的字符可以跟下标为1、3的字符交换
下标为1的字符可以跟下标为0、4、2的字符交换
依次类推,可以得到一个数组

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

接下来就是正常的BFS了,找到0字符的位置,通过上面的数组,得到该位置可以跟哪些字符交换,交换,再把这些交换后的字符串,再进行重复操作。查看是否可以得到目标字符串。

class Solution {
public:int slidingPuzzle(vector<vector<int>>& board) {vector<vector<int>> dist = {{1,3},{0,2,4},{1,5},{0,4},{1,3,5},{2,4}};auto get = [&](string status)->vector<string>{//获得从初始字符串,0与其他位置交换后的所有结果vector<string> result;auto pos = status.find('0');//找到字符0的位置for(const auto& nextpos : dist[pos])//获取与0字符相邻的位置,依次交换{swap(status[pos],status[nextpos]);//交换result.push_back(status);//存储新交换的结果swap(status[pos],status[nextpos]);//交换回去,方便下次0字符与其他方向交换}return result;};string init;//初始字符串for(int i = 0; i < 2; ++i){for(int j = 0; j < 3; ++j){init += char(board[i][j] + '0');//注意}}if(init == "123450")//目标字符串{return 0;}unordered_set<string> set = {init};//存储所有交换后的字符串,用来剪枝queue<pair<string,int>> q;//队列,用来BFSq.emplace(init,0);while(!q.empty()){auto [nowStr,nowStep] = q.front();q.pop();for(auto&& newStr : get(nowStr))//遍历下一次交换的结果字符串{if(!set.count(newStr))//剪枝,还没访问过就存入{if(newStr == "123450")//得到目标字符串return nowStep + 1;q.emplace(newStr,nowStep + 1);//注意要先存进去,再下一条语句插入,不然move以后,移动构造,字符串会变为空set.insert(move(newStr));}}}return -1;}
};

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

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

相关文章

AI爆文写作:或许开放性的标题,才会更让人想点开了解答案

这是新华社公众号的一条推文 从信息传递上来说&#xff0c;新闻标题应该直接&#xff0c;包含关键信息。 但这个标题&#xff0c;却没有直接点名哪个国家&#xff0c;要点进去才能看到。 这就是要让人点开的标题特征&#xff0c;标题没有提供完整信息&#xff0c;是开放性的…

Apache Hive 安装与配置的详细教程

1. Hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能…

infoq读书笔记-Davide Taibi博士-花8年转型微服务却得不到回报,问题出在哪 儿?

InfoQ&#xff1a;您的论文“On the Definition of Microservice Bad Smells”涉及非常多的微服务不良做法&#xff0c;但如果要用几个大类别来列举危害性比较大的微服务反模式&#xff0c;您认为会是哪几类&#xff1f;另外&#xff0c;您能再大概分析说明下造成这个几个反模式…

linux新机快速配置ssh

配置SSH以实现证书登录 要配置新的Linux机器以实现证书登录&#xff0c;您需要执行以下步骤&#xff1a; 安装SSH服务器&#xff1a; sudo apt-get install openssh-server修改SSH端口&#xff08;可选&#xff09;&#xff1a; SSH配置文件&#xff08;通常位于/etc/ssh/sshd…

产品经理-产品设计规范(六)

1. 设计规范 2. 七大定律 2.1 菲茨定律 2.1.1 概念 2.1.2 理解 2.1.3 启示 按钮等可点击对象需要合理的大小尺寸根据用户使用习惯合理设计按钮的相对和绝对位置屏幕的边和角很适合放置像菜单栏和按钮这样的元素 2.1.4 参考使用手机习惯 2.1.5 案例 2.2 席克定律 2.2.1 概念 …

Android make命令简述

Android make命令简述 Android的make系统是一个构建工具,用于管理Android应用项目的编译和构建过程。它使用Makefile文件来定义项目的编译规则和依赖关系。在Android开发中,make系统通常与NDK(Native Development Kit)一起使用,用于编译和构建 C/C++ 代码。make是GNU Mak…

MySQL8.0新特性CTE表达式递归实现累加运算 1+2+…+n 等于多少?

上一篇内容&#xff0c;通过MySQL存储过程实现累加运算 12…n 等于多少的需求&#xff0c;使用当前主流版本MySQL5.7.x 和MySQL8.0.x&#xff0c;以及最新的MySQL8.4 LST版本。 WITH AS子句在MySQL 8.0.x及更高版本中得到支持&#xff0c;而在MySQL 5.7及以下版本中则不支持。…

Spring Boot 中使用 MDC 追踪一次请求全过程(日志链路)

Spring Boot 中使用 MDC 追踪一次请求全过程&#xff08;日志链路&#xff09; ControllerLogAspect package com.yymt.common.trace;import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.…

XShell-连接-Centos 7

XShell 连接Centos 7 一.准备 安装XShell XShell下载地址&#xff1a; 在虚拟机上安装Centos 7&#xff0c;具体操作自行学习 二.Centos 7的准备 1.网络适配器修改为NAT 2.获取IP 输入命令&#xff1a; ip addr我的Centos 7对外IP为192.168.174.129 三.XShell连接Cento…

C++标准模板库(STL)简介

简述 STL&#xff08;Standard Template Library&#xff09;是一套功能强大的 C 模板类和函数的集合&#xff0c;它提供了一系列通用的、可复用的算法和数据结构。它帮住我们实现了基本的数据结构容器&#xff0c;和与之对应的操作。使用它可以减少代码长度&#xff0c;增加代…

TCP 三次握手协议能否变成二次握手

TCP 三次握手协议能否变成二次握手&#xff1f; 看了很多回答&#xff0c;都比较长&#xff0c;按照个人理解的话&#xff0c; 1、第一次握手&#xff1a;建立连接时&#xff0c;客户端发送syn包&#xff08;synj&#xff09;到服务器&#xff0c;并进入SYN_SENT状态&#xf…

docker 离线镜像

1. 在已经部署了镜像的机器上获取镜像   1.1 获取镜像名     docker images   1.2 打包选中对应的镜像     docker save <image_name> -o <image_name>.tar 2. 在将要使用的机器上部署需要的镜像   2.1 加载镜像     docker load -i <image_n…

【百度云千帆AppBuilder】诗词达人:AI引领的诗词文化之旅

文章目录 写在前面&#xff1a;百度云千帆AppBuilder诗词达人&#xff1a;AI引领的诗词文化之旅功能介绍&#xff1a;诗词达人智能体的深度体验1. 诗词接龙学习2. 诗词深度解析3. 互动式问答4. 诗词创作辅助 技术特点详解&#xff1a;"诗词达人"智能体的创新技术零代…

项目9-网页聊天室8(消息的发送和接收之websocket)

这是整个项目最最核心的部分. 但是这个部分的编写&#xff0c;需要依赖"基础设施" 包括不限于前面已经实现的 主界面,用户管理,会话管理, 好友管理, 消息管理 等等.... 发送消息,和接收消息,需要"实时传输 张三 发了一条消息,李四 这边立即就能接收到, 这样的…

【游戏引擎】Unity脚本基础 开启游戏开发之旅

持续更新。。。。。。。。。。。。。。。 【游戏引擎】Unity脚本基础 Unity脚本基础C#语言简介C#基础 Unity脚本基础创建和附加脚本MonoBehaviour生命周期生命周期方法 示例脚本 Unity特有的API常用Unity API 实践示例&#xff1a;制作一个简单的移动脚本步骤1&#xff1a;创建…

对于超长的json数据包,采用分割方式分别上传

例如对于一个长度为5.5M的json数据包&#xff0c;可以将其分割为一包数据长度为64KB大小的小包&#xff0c;再依次读取上传 参考代码如下&#xff1a; #include <stdio.h> #include <string.h>#define SEGMENT_SIZE 64*1024 // 每个数据段的大小&#xff0c;这里…

口碑比较好的相亲交友平台有哪些?正规靠谱的相亲软件排行榜测评

在网络时代&#xff0c;越来越多的人热衷于使用相亲交友软件来寻找生命中的另一半。这些软件确实为许多用户提供了真实可靠的交友平台。然而&#xff0c;市面上的相亲软件种类繁多&#xff0c;质量良莠不齐&#xff0c;让人难以选择。今天&#xff0c;我将介绍几款我使用过且认…

并发编程:ScheduledThreadPoolExecutor你真的了解吗?

前言 首先看到标题&#xff0c;我们其实很多人都知道&#xff0c;但是呢 在实际项目中我们面对很多延迟任务实现方案有很多选择&#xff0c;甚至直接在网上百度反正都能实现就行&#xff0c;但是忽略了很多细节&#xff0c;导致生产上的事故&#xff0c;都是因为没有真正了解到…

Git时光机、Git标签、Git分支、GitHub协作

Git时光机&#xff08;切换版本&#xff09; 1.查看提交历史 HEAD指针指向这次分支的最后一次提交 版本信息一行显示【git log --prettyoneline】 2.引用日志【git reflog】 &#xff08;只在自己的工作区中存在&#xff09; 非常重要&#xff1a;当HEAD指针进行切换之后&…

重学java 43.多线程 多等待多唤醒案例

Fear never builds the future,but hope does. —— 24.5.25 多等待多唤醒问题 在多条线程同时消费同时等待时&#xff0c;会出现问题 BaoZiPu package S77ThreadMoreWait;/*count和flag可以定义成包装类&#xff0c;但要记得给count和flag手动赋值不然对于本案例来说&#xff…