問題源自 UVa "A Famous Music Composer"。12 個音高類(A, A#/Bb, B, C, C#/Db, D, D#/Eb, E, F, F#/Gb, G, G#/Ab)各有大/小調,共 24 個調性。輸入調性名(如 Ab minor),若存在等價異名(如 G# minor)則輸出異名,否則輸出 UNIQUE。
A# ⇄ BbC# ⇄ DbD# ⇄ EbF# ⇄ GbG# ⇄ Ab大/小調保持不變,僅轉換音名。
while (scanf("%s%s", s1, s2) != EOF) {
printf("Case %d:", caseNo++);
if (!strcmp(s1, "A#")) printf(" Bb %s\n", s2);
else if (!strcmp(s1, "Bb")) printf(" A# %s\n", s2);
else if (!strcmp(s1, "C#")) printf(" Db %s\n", s2);
else if (!strcmp(s1, "Db")) printf(" C# %s\n", s2);
else if (!strcmp(s1, "D#")) printf(" Eb %s\n", s2);
else if (!strcmp(s1, "Eb")) printf(" D# %s\n", s2);
else if (!strcmp(s1, "F#")) printf(" Gb %s\n", s2);
else if (!strcmp(s1, "Gb")) printf(" F# %s\n", s2);
else if (!strcmp(s1, "G#")) printf(" Ab %s\n", s2);
else if (!strcmp(s1, "Ab")) printf(" G# %s\n", s2);
else printf(" UNIQUE\n");
}
直接字符串匹配,時間複雜度 O(1) 每測試用例。