【轉盤游戲】有一個轉盤,26個英文字母均勻分佈在轉盤邊緣,轉針初始位置在字母a,每次只能轉動到相鄰的字母,然後輸入一個由26個字母組成的字元串(最長100),不複位地依次轉動到相應的字母位置,問:一共需要轉多少次?編程實現。 Input: 輸入一個字元串,最長100,由26個英文字母組成。... ...
Night at the Museum
題意:
有一個轉盤,26個英文字母均勻分佈在轉盤邊緣,轉針初始位置在字母a,每次只能轉動到相鄰的字母,然後輸入一個由26個字母組成的字元串(最長100),不複位地依次轉動到相應的字母位置,問:一共需要轉多少次?編程實現。
Input:
輸入一個字元串,最長100,由26個英文字母組成。
Output:
輸出需要轉動的次數(整數)。
解題思想:
由於一圈字母中“..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
結果測試: