算法刷题笔记 八数码(C++实现)

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

  • 在一个3×3的网格中,1∼88个数字和一个x恰好不重不漏地分布在这3×3的网格中。
  • 例如:

1 2 3
x 4 6
7 5 8

  • 在游戏过程中,可以把x与其上、下、左、右四个方向之一的数字交换(如果存在)。
  • 我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

1 2 3
4 5 6
7 8 x

  • 例如,示例中图形就可以通过让x先后与右、下、右三个方向的数字交换成功得到正确排列。
  • 现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。

输入格式

  • 输入占一行,将3×3的初始网格描绘出来。
  • 例如,如果初始网格如下所示:

1 2 3
x 4 6
7 5 8

  • 则输入为:1 2 3 x 4 6 7 5 8

输出格式

  • 输出占一行,包含一个整数,表示最少交换次数。
  • 如果不存在解决方案,则输出−1

基本思路

  • 本题可以基于广度优先算法进行求解。对于数码的每一种摆放,我们可以将其视为一种状态,对应于一个图中的某一个结点。通过x和相邻元素的交换可以转移到另一个结点。那么,现在问题就变为,如何从开始状态的结点走到表示最终状态的结点。
  • 由于每一次x与相邻元素发生交换后的状态是可以枚举出来的,因此可以采用广度优先搜索算法进行求解。每找出一种新的状态,就记录从初始状态到当前状态所需的转换次数。

实现代码

#include <iostream>
#include <queue>
#include <unordered_set>
#include <algorithm>
using namespace std;// 用一个结构体来定义每一个状态的数码排列和离初始状态的距离
struct digital_state
{string current;int distance;
};const string end_state = "12345678x";int bfs(const string& start_state)
{// 创建一个用于记录状态的队列,并将开始状态放入队列中queue<digital_state> states;states.push({start_state, 0});// 创建一个哈希集合,存储已经出现过的状态,并将开始状态放入该集合中unordered_set<string> finded;finded.insert(start_state);// 通过循环找出从开始状态开始的所有不同状态,并计算其距离while(states.empty() == false){// 取出队首元素digital_state temp = states.front();states.pop();// 如果队首元素对应的状态就是最终状态,则将该状态的距离返回if(temp.current == end_state) return temp.distance;// 队首元素对应的状态不是最终状态,则查找该状态的下一个可能状态else{// 首先确认字符x所在的位置,并将其转换为行和列int x_position = temp.current.find('x');int x_row = x_position / 3, x_col = x_position % 3;//判定x是否可以向上移动,如果可以则找到移动后的状态if(x_row >= 1){string temp_state = temp.current;swap(temp_state[x_position], temp_state[x_position - 3]);// 如果该状态还未出现过,则记录该状态if(finded.find(temp_state) == finded.end()){// 将该状态放入集合中finded.insert(temp_state);// 将该状态放入队列中states.push({temp_state, temp.distance + 1});}}//判定x是否可以向下移动,如果可以则找到移动后的状态if(x_row <= 1){string temp_state = temp.current;swap(temp_state[x_position], temp_state[x_position + 3]);// 如果该状态还未出现过,则记录该状态if(finded.find(temp_state) == finded.end()){// 将该状态放入集合中finded.insert(temp_state);// 将该状态放入队列中states.push({temp_state, temp.distance + 1});}}//判定x是否可以向左移动,如果可以则找到移动后的状态if(x_col >= 1){string temp_state = temp.current;swap(temp_state[x_position], temp_state[x_position - 1]);// 如果该状态还未出现过,则记录该状态if(finded.find(temp_state) == finded.end()){// 将该状态放入集合中finded.insert(temp_state);// 将该状态放入队列中states.push({temp_state, temp.distance + 1});}}//判定x是否可以向右移动,如果可以则找到移动后的状态if(x_col <= 1){string temp_state = temp.current;swap(temp_state[x_position], temp_state[x_position + 1]);// 如果该状态还未出现过,则记录该状态if(finded.find(temp_state) == finded.end()){// 将该状态放入集合中finded.insert(temp_state);// 将该状态放入队列中states.push({temp_state, temp.distance + 1});}}}}// 不存在解决方案的情况return -1;
}int main(void)
{string start_state;for(int i = 0; i < 9; ++ i) {char c;cin >> c;start_state.push_back(c);}cout << bfs(start_state);return 0;
}

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

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

相关文章

MT7628指定分区备份固件

为了避免升级过程突然断电&#xff0c;或者其他不良操作导致的路由器“变砖”。在MT7628使用过程中&#xff0c;我们可以对固件进行备份。 MT7628原厂SDK有关于双备份的选项&#xff0c;选择对应选项后&#xff0c;可对固件进行备份。下面以SKYLAB的SKW92A模组为例进行测试说明…

【专项刷题】— 快排

1、颜色分类 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 创建三个指针&#xff0c;然后把数组分为三个区域遍历代码&#xff1a; class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…

百度网盘Android一二面凉经(2024)

百度网盘Android一二面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《百度网盘Android一二面凉经(2024)》。 面试职位: 网盘主端研发组_Android高级研…

细说MCU用定时器控制单路DAC模块设计和输出锯齿波的实现方法

目录 一、参考工程 二、仅提供不同的配置 1、用定时器控制DAC输出 2、配置定时器参数 三、代码修改 四、 运行并观察显示效果 一、参考工程 本工程依赖作者的文章&#xff1a;细说MCU用单路DAC模块设计和输出锯齿波的实现方法-CSDN博客 https://wenchm.blog.csdn.net/ar…

Python 如何对上万、百万、亿级数据去重?

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 今天我们要一起探索一个让数据工程师、数据科学家和开发者们都头疼的问题&#xff1a;如何对海量数据进行去重。随着数据量的不断增长&#xff0c;我们在处理数据时&#xff0c;去重操作…

要么利用规则,要么打破规则

在这个充满规则和标准的世界里&#xff0c;我们常常被告知要如何生活、如何成功。但事实上&#xff0c;这些规则和标准往往限制了我们的潜力和创造力。本文将探讨如何不被外界规则所束缚&#xff0c;活出自己的风采。 规则的双刃剑 规则和标准可以为社会带来秩序&#xff0c;…

JavaScript进阶之构造函数数据常用函数

目录 一、深入对象1.1 创建对象的三种方式1.2 构造函数1.3 实例成员&静态成员 二、内置构造函数2.1 Object2.2 Array2.3 String常见实例方法2.4 Number 一、深入对象 1.1 创建对象的三种方式 利用对象字面量创建对象利用new object创建对象 const obj new Object({})利用…

SAP 如何修改统驭科目类型

在SAP中&#xff0c;科目设置错了统驭科目类型并且记账了要如何修改&#xff1f; 例如&#xff1a;前期应收账款对应的统驭科目类型前期设置成了供应商&#xff0c;并且供应商用该科目过来账&#xff0c;现在需要调整&#xff0c;想要将供应商调整到客户&#xff0c;科目为当前…

Java | Leetcode Java题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution {public int missingNumber(int[] nums) {int n nums.length;int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} }

ros2--QOS--通信质量

在ros2通信编程中&#xff0c;总有一个和qos相关的参数&#xff1a; publisher: template<typename MessageT, typename AllocatorT, typename PublisherT> std::shared_ptr<PublisherT> Node::create_publisher(const std::string & topic_name,const rclcp…

Linux安装Redis5.0镜像、Mysql8.0镜像

docker 安装Redis &#xff08;全网最详细&#xff1a;附带配置文件&#xff09;_docker pull redis-CSDN博客 Docker实用-安装Mysql8 - 简书 改动&#xff1a; 指定&#xff1a;docker pull mysql:8.0 docker run -d -p 3306:3306 \ --restartalways \ --privilegedtrue \…

088、Python 读取Excel文件及一些操作(使用xlwtxlrd库)

要读取Excel文件&#xff0c;我们需要使用第三方库。 xlrd库是一个常用的读取Excel的第三方库&#xff0c;它同时支持.xls和.xlsx&#xff0c;不过xlrd从版本2.0.0开始不再支持.xlsx的读取&#xff0c;需要单独使用openpyxl。 要使用第三方库&#xff0c;首选需安装&#xff…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

树与二叉树学习笔记

树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树&#xff1a;定义与特点二叉树&#xff1a;前序、中序、后序遍历二叉树&#xff1a;深度、广度优先遍历二叉树&#xff1a;线索化二叉树&#xff1a;序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…

数学建模算法汇总(全网最全,含matlab案例代码)

数学建模常用的算法分类 全国大学生数学建模竞赛中&#xff0c;常见的算法模型有以下30种&#xff1a; 最小二乘法数值分析方法图论算法线性规划整数规划动态规划贪心算法分支定界法蒙特卡洛方法随机游走算法遗传算法粒子群算法神经网络算法人工智能算法模糊数学时间序列分析马…

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

shell脚本语言的入门

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

pytorch深度学习框架基本介绍

目录 1. PyTorch简介1.1 什么是PyTorch1.2 PyTorch的特点 2. 安装与配置2.1 安装PyTorch2.2 配置CUDA环境 3. 基础概念3.1 张量(Tensor)3.1.1 创建张量3.1.2 张量的类型转换 3.2 自动微分(Autograd) 4. 构建神经网络4.1 定义网络结构4.2 使用nn.Module 5. 数据加载与处理5.1 使…

腾讯技术创作特训营 -- SUPERWINNIE -- AI重塑社交内容

目录 1 什么是AI社交内容 2 案例拆解 3 用LLM做爆文选题 4 用LLM出爆文脚本提示词 1 什么是AI社交内容 任何一个因素被AI取代都是AI社交内容 2 案例拆解 数字人 资讯素材 录屏产品的素材&#xff08;小红书测试AI产品&#xff09; 脚本 素材 剪辑 3 用LLM做爆文选题 &…

帝国神话怎么样使用服务器开服(Myth Of Empires)

1、购买后登录服务器&#xff08;百度莱卡云&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、创建端口 一共需要用到三个端口&#xff08;游戏端口&#xff0c;查询端口&#x…