标签:== aci 目标 clear col 描述 man 左右 tab
@!: |
ABC |
DEF |
GHI |
JKL |
MNO |
PQRS |
TUV |
WXYZ |
第一行一个T(T ≤ 10),表示小美想看的电影数。
接下来 T 行,每行一个长度不超过100,000的字符串,表示一部电影名字的缩写,保证缩写的每个字符都是大写英文字母。
对于每个电影名字缩写,输出输入这个名字的最小按方向键的次数。
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 }
标签:== aci 目标 clear col 描述 man 左右 tab
原文地址:https://www.cnblogs.com/dapeng-bupt/p/9160867.html