问题描述
咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环。这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a。咕咕东每次可以顺时针或者逆时针旋转一格。例如,a顺时针旋转到z,逆时针旋转到b。咕咕东手里有一个字符串,但是他太笨了,所以他来请求你的帮助,问最少需要转多少次。
Input
输入只有一行,是一个字符串。
Output
输出最少要转的次数。
Sample input
zeus
Sample output
18
解题思路
这个题是一个模拟题,就是按照题目要求,计算字符串两个相邻字符之间的最短距离即可。我们可以直接对两个字符做差计算它们之间的距离,要考虑的是取顺时针还是逆时针。
如果是顺时针转动,距离为s[i]-s[i-1];如果逆时针转动,距离为’z’-s[i]+s[i-1]-‘a’+1。两者的结果如果是负数,就加26(因为这是一个环)。
完整代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
using namespace std;
string s;
long long ans;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>s;
int len1=s[0]-'a';
int len2='z'-s[0]+1;
ans+=min(len1>=0?len1:100,len2>=0?len2:100);
for (int i=1; i<s.length(); i++)
{
len1=s[i]-s[i-1];
len1=min(abs(len1),len1+26);//这么写纯粹是懒得判断len1是否为正数了
len2='z'-s[i]+s[i-1]-'a'+1;
len2=min(abs(len2),len2+26);
ans+=min(len1,len2);
}
cout<<ans<<endl;
return 0;
}