請你設計一個程序,該程序接受起始字母和目標字母作為輸入,通過在字母表中向前或向后移動來計算兩個給定字母之間的最短路徑。然后,程序會沿著最短路徑打印出從起始字母到目標字母的所有字母。例如,如果輸入“c”和“k”作為起始字母和目標字母,則程序將計算出在字母表中向前移動的路徑為 cdefghijk,它需要 8 個字母,在字母表中向后移動的路徑是cbazyxwvutsrqponmlk,它需要 19 個字母。因此,程序將打印 cdefhijk,因為 8 個字母小于 19 個。
注意在字母數相等的情況下,程序將打印字母在字母表中向前移動。
輸入格式:
輸入為兩個同為大寫或同為小寫的字母,空格分隔。
輸出格式:
輸出向前或向后移動的最短字母串。
輸入樣例1:
H K
輸出樣例1:
HIJK
輸入樣例2:
b w
輸出樣例2:
bazyxw
輸入樣例3:
Q D
輸出樣例3:
QRSTUVWXYZABCD
輸入樣例4:
m m
輸出樣例4:
m
目錄
?完整代碼
?計算向前和向后的步數
??選擇路徑
?輸出路徑字母
向前移動
?向后移動
?處理相同字母的情況
示例分析
示例 1:H K
示例 2:b w
示例 3:Q D
示例 4:m m
?關鍵點總結
字母表循環處理
路徑選擇?
淺說:這道題小假對其思路和解題步驟都做了詳細地講解,方便大家理解 ~??
?完整代碼
#include<bits/stdc++.h>
using namespace std;int main() {char start, end;cin >> start >> end;int forward = (end - start + 26) % 26;int backward = (start - end + 26) % 26;if (forward <= backward) {for (int i = 0; i <= forward; ++i) {char c = start + i;if (isupper(start)) {if (c > 'Z') c -= 26;} else {if (c > 'z') c -= 26;}cout << c;}} else {for (int i = 0; i <= backward; ++i) {char c = start - i;if (isupper(start)) {if (c < 'A') c += 26;} else {if (c < 'a') c += 26;}cout << c;}}return 0;
}
?計算向前和向后的步數
int forward = (end - start + 26) % 26;
int backward = (start - end + 26) % 26;
-
forward
:從?start
?到?end
?向前移動的步數。-
end - start
:直接計算字母的 ASCII 差值。 -
+ 26
:確保差值為正(避免負數)。 -
% 26
:因為字母表有 26 個字母,取模后得到實際的步數。
-
-
backward
:從?start
?到?end
?向后移動的步數。-
start - end
:直接計算字母的 ASCII 差值。 -
+ 26
?和?% 26
:同上,確保步數為正。
-
??選擇路徑
if (forward <= backward) {// 向前移動
} else {// 向后移動
}
-
如果?
forward <= backward
,選擇向前移動的路徑(步數更少或相等)。 -
否則,選擇向后移動的路徑(步數更少)。
?輸出路徑字母
向前移動
for (int i = 0; i <= forward; ++i) {char c = start + i;if (isupper(start)) {if (c > 'Z') c -= 26; // 處理大寫字母循環} else {if (c > 'z') c -= 26; // 處理小寫字母循環}cout << c;
}
-
從?
start
?開始,依次輸出?start + i
(i
?從 0 到?forward
)。 -
如果字符超出字母表范圍(如?
start
?是大寫字母且?start + i > 'Z'
),則通過?-= 26
?回到字母表開頭(如?'Z' + 1 -> 'A'
)。
?向后移動
for (int i = 0; i <= backward; ++i) {char c = start - i;if (isupper(start)) {if (c < 'A') c += 26; // 處理大寫字母循環} else {if (c < 'a') c += 26; // 處理小寫字母循環}cout << c;
}
-
從?
start
?開始,依次輸出?start - i
(i
?從 0 到?backward
)。 -
如果字符超出字母表范圍(如?
start
?是小寫字母且?start - i < 'a'
),則通過?+= 26
?回到字母表末尾(如?'a' - 1 -> 'z'
)。
?處理相同字母的情況
如果?start == end
,則?forward
?和?backward
?都為 0,直接輸出?start
。
示例分析
示例 1:H K
-
start = 'H'
?(72),?end = 'K'
?(75) -
forward = (75 - 72 + 26) % 26 = 3
-
backward = (72 - 75 + 26) % 26 = 23
-
forward < backward
,選擇向前移動。 -
輸出:
H (72), I (73), J (74), K (75)
?→?HIJK
示例 2:b w
-
start = 'b'
?(98),?end = 'w'
?(119) -
forward = (119 - 98 + 26) % 26 = 21
-
backward = (98 - 119 + 26) % 26 = 5
-
forward > backward
,選擇向后移動。 -
輸出:
b (98), a (97), z (122), y (121), x (120), w (119)
?→?bazyxw
示例 3:Q D
-
start = 'Q'
?(81),?end = 'D'
?(68) -
forward = (68 - 81 + 26) % 26 = 13
-
backward = (81 - 68 + 26) % 26 = 13
-
forward == backward
,選擇向前移動。 -
輸出:
Q (81), R (82), ..., Z (90), A (65), B (66), C (67), D (68)
?→?QRSTUVWXYZABCD
示例 4:m m
-
start = 'm'
,?end = 'm'
-
forward = 0
,?backward = 0
-
直接輸出?
m
。
?關鍵點總結
字母表循環處理
-
通過?
+ 26
?和?% 26
?確保步數計算正確(避免負數或超出范圍)。 -
在輸出時,通過?
+= 26
?或?-= 26
?處理字母表的循環(如?'Z' + 1 -> 'A'
)。
路徑選擇?
-
優先選擇步數少的路徑。
-
步數相同時,選擇向前移動的路徑。
?大小寫區分
-
使用?
isupper
?判斷字母大小寫,確保正確處理?'A'-'Z'
?和?'a'-'z'
?的循環。?
?如果小假的內容對你有幫助,請點贊,評論,收藏。創作不易,大家的支持就是我堅持下去的動力!