前言:本文简单介绍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>