Night at the Museum
有一個轉盤,26個英文字母均勻分布在轉盤邊緣,轉針初始位置在字母a,每次只能轉動到相鄰的字母,然後輸入一個由26個字母組成的字符串(最長100),不復位地依次轉動到相應的字母位置,問:一共需要轉多少次?編程實現。
輸入一個字符串,最長100,由26個英文字母組成。
輸出需要轉動的次數(整數)。
由於一圈字母中“..za..”段是不連續的,所以需要分情況討論,我是這麼分的:
以轉針所指字母pointer和圓心連線為軸,軸右側(即<pointer,pointer+13或pointer-13>),除了轉針指向‘a’時,其它時刻軸兩側肯定有一側字母連續 另一側字母無法連續(包含"za"串) 。
軸左右指的是將軸豎直放置,轉針一頭在上,此時的左右側 。
不難看出pointer以‘n’為界限,小於‘n’時不連續段在軸左側,大於‘n’時不連續段在軸右側。如下圖:
最後代碼:

1 # include <iostream>
2 # include <string>
3 using namespace std;
4
5 int main(void)
6 {
7 int clockLetter(string c);
8 string s;
9 int numStep;
10 cin >> s;
11
12 numStep = clockLetter(s);
13
14 cout << numStep << endl;
15 return 0;
16 }
17
18 int clockLetter(string c)
19 {
20 int n = 0; // 步數,初值為0
21 int i;
22 char pointer = 'a'; // 轉針初始值為‘a’
23
24 for(int i=0;i<c.length();i++)
25 { // 以轉針所指字母和圓心連線為軸,軸右側(即<pointer,pointer+13或pointer-13>),除了轉針指向‘a’時,其它時刻軸兩側肯定有一側字母連續 另一側字母無法連續(包含"za"串) 。
26 // 軸左右指的是將軸豎直放置,轉針一頭在上,此時的左右側
27 if(pointer <= 'n') // 此時軸左側字母不連續
28 {
29 if(c[i]>=pointer&&c[i]<=pointer+13) // 連續段
30 {
31 n += c[i]-pointer;
32 }
33 else if(c[i]>pointer+13) // 不連續段 1
34 {
35 n += 26 - (c[i]-pointer);
36 }
37 else if(c[i]<pointer) // 不連續段 2
38 {
39 n += pointer-c[i];
40 }
41 }
42 else if(pointer > 'n') // 此時軸右側字母不連續
43 {
44 if(c[i]<=pointer&&c[i]>=pointer-13) // 連續段
45 {
46 n += pointer-c[i];
47 }
48 else if(c[i]>pointer) // 不連續段 3
49 {
50 n += c[i] - pointer;
51 }
52 else if(c[i]<pointer-13) // 不連續段 4
53 {
54 n += 26 - ( pointer - c[i] );
55 }
56 }
57
58 pointer = c[i]; // 在轉下一個字母的時候,讓指針停在當前位置,不復位
59 }
60
61 return n;
62 }
C++ Code