參考 題型範例 - 全國高級中等學校技藝競賽平台 工業類 題目:這不是河內塔喔! 假設在 A 柱上有五個色環,如圖 (a) 所示,排列順序由上而下為 1, 2, 3, 4, 5,小明要把 A 柱上的色環搬到 C 柱上,但每個色環都必須經過 B 柱,搬法有各種組合,例如可以通通先搬到 B 柱上,例如圖 (b),先將五個色環按照次序由 A 柱搬到 B 柱上,再將五個色環依照順序如圖 (c),由 B 柱搬到 C 柱上,最後在 C 柱上的色環由上而下順序為 1, 2, 3, 4, 5。也可以一次搬一個色環如圖 (d),由 A 柱一次搬一個色環到 B 柱,再如圖 (e),把這個色環由 B 柱搬到 C 柱,最後的結果如圖 (f) 所示,在 C 柱上的色環由上而下順序為 5, 4, 3, 2, 1。 現在請你寫一個程式,判斷 C 柱上的色環由上而下的順序是否為可能的排列順序。 執行結果 執行結果 執行結果 using System; namespace _109_3 { internal class Program { private static Stack<int> B = new Stack<int>(); private static List<int> A, C; static void Main(string[] args) { int n = int.Parse(Console.ReadLine()); do { int k = 0, ic = 0; string ans = "Yes"; string s = Console.ReadLine(); if (s == "0") break; B.Clear(); C = new List<int>(Array.ConvertAll(s.Split(' '), int.Parse)); C.Reverse(); A = Enumerable.Range(1, n).ToList(); do { k = A.IndexOf(C[ic]); if (k < 0)//不在 A 裡面 { if (B.Peek() == C[ic]) { B.Pop(); ic++; } else { ans = "No"; break; } } else//A 裡面有 { for (int i = 0; i < k; i++) { B.Push(A[0]); A.RemoveAt(0); } A.RemoveAt(0); ic++; } } while (ic < n); Console.WriteLine(ans); } while (true); } } } |