最小步数模型(魔板 - BFS)

前言:本文简单介绍unordered_map的一些用法和原理以及最小步数模型问题的求解

文章目录

unordered_map

在看这道题之前,先熟悉一下C++11 的 unordered_map如何使用:

简介
unordered_map是一个关联容器,内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的,存储由键值key和映射值value的组合形成的元素;

比较map和unordered_map:

时间效率上,unordered_map最高,而map效率较低但 提供了稳定效率和有序的序列。
空间效率上,map内存占用略低,unordered_map内存占用略高,而且是线性成比例的。

内部实现:

map的内部实现是红黑树(二叉搜索树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键) ;红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。

unordered_map内部实现了一个哈希表,通过把关键值key映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),元素的排列顺序是无序的

适用情况:

使用时视情况而定:需要无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在意时候用map。

魔板一题使用的unordered_map先介绍一下:

//定义数据: 
unordered_map<string, pair<char, string>> pre;
unordered_map<string, int> dist;

//查找元素:
dist.count(m[i])
//取出键值或映射值
 res += pre[end].first;
 end = pre[end].second;

还有很多基本操作和map中的基本操作用法相同,参考map基本操作

----------------------------------------------华丽分割线--------------------------------------------------------

魔板

Rubik 先生在发明了风靡全球的魔方之后,又发明了它的二维版本——魔板。

这是一张有 8 个大小相同的格子的魔板:

1 2 3 4
8 7 6 5
我们知道魔板的每一个方格都有一种颜色。

这 8 种颜色用前 8 个正整数来表示。

可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。

对于上图的魔板状态,我们用序列 (1,2,3,4,5,6,7,8) 来表示,这是基本状态。

这里提供三种基本操作,分别用大写字母 A,B,C 来表示(可以通过这些操作改变魔板的状态):

A:交换上下两行;
B:将最右边的一列插入到最左边;
C:魔板中央对的4个数作顺时针旋转。

下面是对基本状态进行操作的示范:

A:

8 7 6 5
1 2 3 4

B:

4 1 2 3
5 8 7 6

C:

1 7 2 4
8 6 3 5

对于每种可能的状态,这三种基本操作都可以使用。

你要编程计算用最少的基本操作完成基本状态到特殊状态的转换,输出基本操作序列。

注意:数据保证一定有解。

输入格式

输入仅一行,包括 8 个整数,用空格分开,表示目标状态。

输出格式

输出文件的第一行包括一个整数,表示最短操作序列的长度。

如果操作序列的长度大于0,则在第二行输出字典序最小的操作序列。

数据范围

输入数据中的所有数字均为 1 到 8 之间的整数。

输入样例:

2 6 8 4 5 7 3 1

输出样例:

7
BCABCCB

这类题目的思路比较清晰易于理解,但是代码量比较大,考验代码能力。
对于我这个渣渣新手,得先熟悉一下unordered_map才行。

代码仅供参考:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值