參考 題型範例 - 全國高級中等學校技藝競賽平台 工業類

題目:這不是河內塔喔!


問題描述
假設在 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 柱上的色環由上而下的順序是否為可能的排列順序。
輸入格式輸出格式
輸入含有多組測試資料。每組測試資料的第一列,有 1 個整數 n,代表有 n 個色環,在 A 柱上的
排列順序由上而下為 1,2,…, n。接下來會有多列測試資料,每一列有 n 個整數,數字範圍為 1 到 n 的任意順序,代表 C 柱上的色環由上而下的排列順序。當遇到僅含一個 0 的一列,代表該組測試資料結束。
3 ≤ n ≤ 20
對每一列的測試資料,如果是 C 柱上可能的排列順序,請輸出 YES!,否則輸出
NO!
每組測試資料後請空一行,請參考範例輸出。

範例一
輸入正確輸出
5
1 2 3 4 5
5 4 3 2 1
5 4 3 1 2
4 3 5 2 1
3 2 1 4 5
0
YES!
YES!
YES!
NO!
NO!

執行結果


範例二
輸入正確輸出
7
1 2 6 7 3 5 4
4 3 2 1 7 6 5
5 6 7 1 2 3 4
0
YES!
NO!
YES!

執行結果


範例三(額外)
輸入正確輸出
20
20 1 19 18 2 16 17 15 14 4 13 9 12 10 11 8 5 7 6 3
19 9 20 16 17 18 15 14 10 13 11 12 8 7 1 2 3 6 5 4
0
    
YES!
NO!
    

執行結果


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);
        }
    }
}