美团点评2018 CodeM A轮初赛
Posted dapeng-bupt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了美团点评2018 CodeM A轮初赛相关的知识,希望对你有一定的参考价值。
题目一描述
小美想要在电视上看电影,我们知道在电视上搜索电影可以通过搜索电影名字首字母缩写得到,通过首字母搜索电影的界面由一个九宫格组成,如下图:
@!: |
ABC |
DEF |
GHI |
JKL |
MNO |
PQRS |
TUV |
WXYZ |
光标初始在这个九宫格的左上方,也就是在 “@!:”的位置,每次小美想要输入一个字母,需要通过不断地按上下左右四个方向键(并且只能按方向键),把光标从当前所在的格子移动到目标的格子(也就是待输入的字母所在的格子),然后在目标的格子上通过其他的按键来输入字母。小美觉得频繁地按方向键是十分烦人的事情,所以她想设计一种移动光标方案使得方向键按的次数最少。问最少要几次?
小美想看 T 部电影,所以她会问你 T 个电影名字的缩写分别需要多少次输入。
注意在一个电影名字输入完以后,光标会回到左上角,期间按的方向键不会计入答案。
小美想看 T 部电影,所以她会问你 T 个电影名字的缩写分别需要多少次输入。
注意在一个电影名字输入完以后,光标会回到左上角,期间按的方向键不会计入答案。
输入描述:
第一行一个T(T ≤ 10),表示小美想看的电影数。
接下来 T 行,每行一个长度不超过100,000的字符串,表示一部电影名字的缩写,保证缩写的每个字符都是大写英文字母。
输出描述:
对于每个电影名字缩写,输出输入这个名字的最小按方向键的次数。
示例1
输入
2 AA AT
输出
1 3
参考代码与分析:
第一题就是个热身题目,本身并不难,本质上是计算一连串字符中相邻字符的距离之和,只是这里的距离要求是最短距离,也就是汉明距离,主要是先把字母映射到对应的位置,用x和y的有序数对表示横纵坐标,设最开始的位置坐标为(0,0),设两个字母分别属于的按键为A(x1,y1), B(x2,y2),那么最后的AB之间的最小距离为abs(x1 - x2) + abs(y1 - y2)
代码如下:
1 #include<algorithm> 2 #include<iostream> 3 #include<string> 4 #include<vector> 5 #include<queue> 6 #include<unordered_map> 7 #include<functional> 8 #include<iomanip> 9 #include<cmath> 10 using namespace std; 11 //建立索引表格 12 unordered_map<int, pair<int, int> > m = 13 { {1,make_pair(0, 0) },{ 2,make_pair(0,1) },{ 3,make_pair(0, 2) },{ 4,make_pair(1, 0) },{ 5,make_pair(1, 1) }, 14 { 6,make_pair(1, 2) } ,{ 7,make_pair(2, 0) } ,{ 8,make_pair(2, 1) } ,{ 9,make_pair(2, 2) }}; 15 int findDis( pair<int, int > m1, pair<int, int> m2); 16 int getKey(char c); 17 int main() 18 { 19 //string s; 20 //cin >> s; 21 int n; 22 cin >> n; 23 while (n--) 24 { 25 string s; 26 cin >> s; 27 int len = s.size(); 28 int res = 0; 29 30 for (int i = 0; i < len; i++) 31 { 32 int id = 1; 33 id = getKey(s[i]); 34 if (i == 0) 35 { 36 res += findDis(m[id], m[1]); 37 continue; 38 } 39 res += findDis(m[id], m[getKey(s[i-1])]); 40 41 } 42 cout << res << endl; 43 } 44 45 system("pause"); 46 return 0; 47 } 48 int findDis( pair<int, int> m1, pair<int, int> m2) 49 { 50 return abs(m1.first - m2.first) + abs(m1.second - m2.second); 51 } 52 int getKey(char c) 53 { 54 int id = 1; 55 if (c - ‘A‘ <= 2) 56 id = 2; 57 else if (c - ‘A‘ <= 5) 58 id = 3; 59 else if (c - ‘A‘ <= 8) 60 id = 4; 61 else if (c - ‘A‘ <= 11) 62 id = 5; 63 else if (c - ‘A‘ <= 14) 64 id = 6; 65 else if (c - ‘A‘ <= 18) 66 id = 7; 67 else if (c - ‘A‘ <= 21) 68 id = 8; 69 else 70 id = 9; 71 return id; 72 }
以上是关于美团点评2018 CodeM A轮初赛的主要内容,如果未能解决你的问题,请参考以下文章
美团2017年CodeM大赛-初赛B轮 黑白树 (树形dp)