美团点评2018 CodeM A轮初赛

Posted dapeng-bupt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了美团点评2018 CodeM A轮初赛相关的知识,希望对你有一定的参考价值。

题目一描述

    小美想要在电视上看电影,我们知道在电视上搜索电影可以通过搜索电影名字首字母缩写得到,通过首字母搜索电影的界面由一个九宫格组成,如下图:
 

@!:

ABC

DEF

GHI

JKL

MNO

PQRS

TUV

WXYZ

 
    光标初始在这个九宫格的左上方,也就是在 “@!:”的位置,每次小美想要输入一个字母,需要通过不断地按上下左右四个方向键(并且只能按方向键),把光标从当前所在的格子移动到目标的格子(也就是待输入的字母所在的格子),然后在目标的格子上通过其他的按键来输入字母。小美觉得频繁地按方向键是十分烦人的事情,所以她想设计一种移动光标方案使得方向键按的次数最少。问最少要几次?
    小美想看 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轮初赛的主要内容,如果未能解决你的问题,请参考以下文章

CodeM美团点评编程大赛初赛B轮 黑白树DFS深搜+暴力

美团CodeM初赛B轮 合并字符串的价值 (暴力)

美团2017年CodeM大赛-初赛B轮 黑白树 (树形dp)

美团点评CodeM编程大赛;fastjson 1.2.33 发布;“闪电立方”一次可传100T数据

CodeM美团点评编程竞赛资格赛题

Loj #6164. 「美团 CodeM 初赛 Round A」数列互质