题目
过程
C++中的map用法
map是C++中STL中的一个关联容器,以键值对来存储数据,数据类型自己定义。
同时map是一对一的,具体就是键值是唯一的,跟哈希表的概念差不多。
map<key,value>使用方法:
map.count(“amy”) //查看map中键值为amy的键值对有几个,只能为1或0,因为map键值唯一
status_map[pieces] ++; //map[key]==value ,所以相当于int类型的value++
unordered_map和map的区别
- map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。
- unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的
思路
利用map键值唯一的性质,将棋盘局面(包含64各字符的字符串string)设置为键值,将该局面是第几次出现设置为数据值,即map<string, int> status_map;每次输入新的棋盘局面,就通过键值一步对比出是否重复,若重复,数据值+1;否则,数据值=1。2层循环。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
char pieces[64];
map<string,int>s_map;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<64;j++)
cin>>pieces[j];
if(s_map.count(pieces))s_map[pieces]++;
else s_map[pieces]=1;
cout<<s_map[pieces]<<endl;
}
}
结果