zoukankan      html  css  js  c++  java
  • 美团点评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 }
  • 相关阅读:
    第十六周个人作业
    排球比赛积分程序
    本周个人总结
    本周个人总结
    排球积分规则
    我与计算机
    排球计分(实践)
    观后感
    18周 个人作业
    总结
  • 原文地址:https://www.cnblogs.com/dapeng-bupt/p/9160867.html
Copyright © 2011-2022 走看看