A-咕咕东的奇遇
题目描述
咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环。这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a。咕咕东每次可以顺时针或者逆时针旋转一格。例如,a顺时针旋转到z,逆时针旋转到b。咕咕东手里有一个字符串,但是他太笨了,所以他来请求你的帮助,问最少需要转多少次。
Input
输入只有一行,是一个字符串。
Output
输出最少要转的次数。
Sample Input
zeus
Sample Output
18
Note
数据点 | 字符串长度 |
---|---|
1,2 | 小于等于10 |
3,4,5 | 小于等于100 |
6,7,8,9,10 | 小于等于10000 |
题解
- 总体思路:循环输入单个字符,计算它与上一个字符的距离,把这些距离相加即得答案
- test存放每次输入的字符,last存放的是上一个字符(初始值设为a),ans存放最终答案
- 在循环时,dis(distance)表示的是从last转到test沿字母顺序转(没有从a到z或从z到a的跳变)所需要转的格数,若该数大于13,则证明从转盘的另一边转的话距离更短,ans=ans+(26-dis);若该数小于13,则ans=ans+dis。
- 所有的数都输入完后,计算也完成,输出ans即可
- 另一种方法是开一个字符型数组存放所有字母,应注意数组太大可能会爆栈,所以大数组要在静态区声明,并开大亿点点。
代码
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <math.h>
using namespace std;
int main(int argc, char** argv) {
char test;
int ans=0;
char last='a';
while(cin>>test){
int dis=abs(test-last);
if(dis<=13){
ans=ans+dis;
}else{
ans=ans+(26-dis);
}
last=test;
}
cout<<ans<<endl;
return 0;
}