CodeM美团2018初赛A轮 题目一

CodeM美团2018初赛A轮 题目一

描述

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

这里写图片描述
光标初始在这个九宫格的左上方,也就是在 “@!:”的位置,每次小美想要输入一个字母,需要通过不断地按上下左右四个方向键(并且只能按方向键),把光标从当前所在的格子移动到目标的格子(也就是待输入的字母所在的格子),然后在目标的格子上通过其他的按键来输入字母。小美觉得频繁地按方向键是十分烦人的事情,所以她想设计一种移动光标方案使得方向键按的次数最少。问最少要几次?
小美想看 T 部电影,所以她会问你 T 个电影名字的缩写分别需要多少次输入。
注意在一个电影名字输入完以后,光标会回到左上角,期间按的方向键不会计入答案。

输入描述:

第一行一个T(T ≤ 10),表示小美想看的电影数。
接下来 T 行,每行一个长度不超过100,000的字符串,表示一部电影名字的缩写,保证缩写的每个字符都是大写英文字母。
输出描述:
对于每个电影名字缩写,输出输入这个名字的最小按方向键的次数。
示例1

输入

2
AA
AT

输出

1
3

分析

第一题卡了很久,一开始想成了3*3对称矩阵,结果忽略了副对角线上的移动

[ 1 2 3 2 3 4 3 4 5 ]

本质上是计算一连串字符中相邻字符的距离之和,只是这里的距离要求是最短距离,也就是汉明距离,主要是先把字母映射到对应的位置,用x和y的有序数对表示横纵坐标,设最开始的位置坐标为(0,0),设两个字母分别属于的按键为A(x1,y1), B(x2,y2),那么最后的AB之间的最小距离为abs(x1 - x2) + abs(y1 - y2),后来结合矩阵下角标构造如下,
[ 11 12 13 21 22 23 31 32 33 ]

参考代码(有点粗暴)

#include<string>
#include<iostream>
#include<cmath>
using namespace std;
int main() {
    string str;
    int n;
    cin>>n;
    int r[n];
    int strint[100010][2]={0};
    for(int k=0; k<n; k++) {
        cin>>str;
        int sum=0;
        for(int i=0; i<str.length(); i++) { 
            if(str[i]=='A') { strint[i][0]=1;strint[i][1]=2;}
            if(str[i]=='B') { strint[i][0]=1;strint[i][1]=2;}
            if(str[i]=='C') { strint[i][0]=1;strint[i][1]=2;}
            if(str[i]=='D') { strint[i][0]=1;strint[i][1]=3;}
            if(str[i]=='E') { strint[i][0]=1;strint[i][1]=3;}
            if(str[i]=='F') { strint[i][0]=1;strint[i][1]=3;}
            if(str[i]=='G') { strint[i][0]=2;strint[i][1]=1;}
            if(str[i]=='H') { strint[i][0]=2;strint[i][1]=1;}
            if(str[i]=='I') { strint[i][0]=2;strint[i][1]=1;}
            if(str[i]=='J') { strint[i][0]=2;strint[i][1]=2;}
            if(str[i]=='K') { strint[i][0]=2;strint[i][1]=2;}
            if(str[i]=='L') { strint[i][0]=2;strint[i][1]=2;}
            if(str[i]=='M') { strint[i][0]=2;strint[i][1]=3;}
            if(str[i]=='N') { strint[i][0]=2;strint[i][1]=3;}
            if(str[i]=='O') { strint[i][0]=2;strint[i][1]=3;}
            if(str[i]=='P') { strint[i][0]=3;strint[i][1]=1;}
            if(str[i]=='Q') { strint[i][0]=3;strint[i][1]=1;}
            if(str[i]=='R') { strint[i][0]=3;strint[i][1]=1;}
            if(str[i]=='S') { strint[i][0]=3;strint[i][1]=1;}
            if(str[i]=='T') { strint[i][0]=3;strint[i][1]=2;}
            if(str[i]=='U') { strint[i][0]=3;strint[i][1]=2;}
            if(str[i]=='V') { strint[i][0]=3;strint[i][1]=2;}
            if(str[i]=='W') { strint[i][0]=3;strint[i][1]=3;}
            if(str[i]=='X') { strint[i][0]=3;strint[i][1]=3;}
            if(str[i]=='Y') { strint[i][0]=3;strint[i][1]=3;}
            if(str[i]=='Z') { strint[i][0]=3;strint[i][1]=3;}
            if(i==0) {
                sum=sum+fabs(strint[i][0]-1)+fabs(strint[i][1]-1);
            } else {
                sum=sum+fabs(strint[i][0]-strint[i-1][0])+fabs(strint[i][1]-strint[i-1][1]);
            }

        }
        r[k]=sum;
    }
    for(int k=0; k<n; k++) {
        cout<<r[k];
        if(k<n-1)cout<<endl;
    }
    return 0;

}

这里写图片描述

最后膜拜前排高中生,还有可爱的吉老师
这里写图片描述

猜你喜欢

转载自blog.csdn.net/lewyu521/article/details/80637236
今日推荐