E-tutor [程式設計][C_AR182-中] 翻轉吧陣列

簡介

題目來源:e-tutor平台
[C_AR182-中] 翻轉吧陣列

翻轉吧陣列,先儲存資料後,經題目的命令,做出三種不同的二維陣列翻轉,做完這題可以使我們對陣列更加的了解

讓我們先了解題目內容

問題描述:

假設一個 N * N 的陣列 ( N <= 20 ),每個位置從左到右,從上到下,依序填入 1 ~ N² 的數字,假設 N = 4,陣列的初始狀態如圖所示。接著,這裡有三種翻轉動作,分別是水平、垂直與對角翻轉,從初始狀態分別進行這三種翻轉動作後對應的結果分別如圖所示:

 

請撰寫一個程式,可以先讀取一個正整數 N,接著讀入一串由 H V D 所組成的翻轉字串,接著輸出初始狀態經過一連串翻轉後的結果。

Input:

輸入資料有兩行,第一行是陣列大小 N ( N <= 20 ),第二行是一個由 H V D 所組成的字串,長度 <= 20。

Output:

輸出初始狀態經過指定之一連串翻轉動作後的結果。

範例:

解題想法:

先把題目所需的方陣中數字填進去,依照命令分開寫不同的迴圈來翻轉矩陣,並且每次翻轉完取代原本的陣列,最後再輸出答案。

第一步、處理題目所需的輸入格式

1.宣告題目所需的陣列大小,number

2.宣告整數 count 等於 1,這個計數器後面會派上用場

3.宣告題目需讀入的翻轉指令字串 s

4.輸入整數 number 和字串 s

※輸入 number 後,再輸入字串 s 前要先加入 cin.ignore(1000,'\');

    避免輸入完數字後按 enter,程式會誤以為 enter 就是字串 s

5.使用 vector 功能建立一個用來儲存方陣的二維整數陣列,OriginalArray


第二步、依測試資料提供的陣列大小,把數字放進二維陣列

題目並沒有給我們整個二維陣列裡的值

每次陣列的大小也不一定

因此陣列裡的值只能有我們自己放進去

1.設置一個迴圈為陣列中的列

2.迴圈內宣告一個整數陣列 buf1,為放數字用

3.迴圈內設置第二個迴圈為陣列中的行

    這時 count 就派上用場了
 
   迴圈每跑一次,就把 count 的值放進 buf1 陣列中

   並把 count 加 1

4.在第二個迴圈外把整數一維陣列 buf1 放進二維陣列 OriginalArray 中


※在寫多重迴圈時,注意變數名稱不要重複,否則會有問題

第三步、掃描字串 s,並製造題目中的三種翻轉方法

設置掃描 s 字串的迴圈

1.如果 s 字串中有元素為 " H "

   水平翻轉

   如何水平翻轉?



  1-1.
         使用 vector 設置一個儲存水平翻轉的二維陣列,Horizontal

  1-2.
         如第二步,設置雙重迴圈
 
         設置完列迴圈後,先在迴圈內宣告整數一維陣列 hbuf,為等等要放進 Horizontal

  1-3.
        在列迴圈內設置行迴圈

        起始值 k 設為每列的最後一項,從每列的最尾端開始往前

        把每個元素放進 hbuf 陣列中

        接著在迴圈外把 hbuf 陣列放進二維陣列 Horizontal

  1-4.
       原始陣列翻轉後放在二維陣列 Horizontal

       現在要把原始陣列覆蓋掉,修改成二維陣列 Horizontal

       設定雙重迴圈

       把 OriginalArray 每列每行的元素都變成 Horizontal

       成功覆蓋後記得清空 Horizontal

       這樣重複使用時才不會出現錯誤

2.如果 s 字串中有元素為 " V "

   垂直翻轉

   如何垂直翻轉?



  2-1.
         使用 vector 設置一個儲存垂直翻轉的二維陣列,Vertical

  2-2.
         如第一點,設置雙重迴圈
 
         設置列迴圈後
 
         起始值 j 設為每行的最後一項,從每行的最尾端開始往前

         先在迴圈內宣告指數一維陣列 vbuf,為等等要放進 Vertical

  2-3.
        在列迴圈內設置行迴圈

        把每個元素放進 vbuf 陣列中

        接著在迴圈外把 vbuf 陣列放進二維陣列 Vertical

  2-4.
       原始陣列翻轉後放在二維陣列 Vertical

       現在要把原始陣列覆蓋掉,修改成二維陣列 Vertical

       設定雙重迴圈

       把 OriginalArray 每列每行的元素都變成 Vertical

       成功覆蓋後記得清空 Vertical

       這樣重複使用時才不會出現錯誤

       
3.如果 s 字串中有元素為 " D "

   對角翻轉

   如何對角翻轉?
 


  3-1.
         使用 vector 設置一個儲存對角翻轉的二維陣列,Diagonal

  3-2.
         設置雙重迴圈
 
         設置完列迴圈後,先在迴圈內宣告整數一維陣列 dbuf,為等等要放進 Diagonal

  3-3.
        在列迴圈內設置行迴圈

        把每個元素放進 dbuf 陣列中

        放進時記得把列 j 和行 k 對調, OriginalArray[k][j] → OriginalArray[k][j]
 
        接著在迴圈外把 dbuf 陣列放進二維陣列 Diagonal

  3-4.
       原始陣列翻轉後放在二維陣列 Diagonal

       現在要把原始陣列覆蓋掉,修改成二維陣列 Diagonal

       設定雙重迴圈

       把 OriginalArray 每列每行的元素都變成 Diagonal

       成功覆蓋後記得清空 Diagonal

       這樣重複使用時才不會出現錯誤

 
第四步、輸出陣列 OriginalArray 的所有元素

1.設置雙重迴圈,分別為搜尋列與行

2.依照題目輸出格式須以矩陣方式輸出

   因此要設定判斷式來判斷何時需要空白何時需要斷行

   如果輸出為每列的最後一個元素時就斷行

   否則就加空白

這樣就完成了!

以下為完整程式碼

留言

這個網誌中的熱門文章

E-tutor [程式設計][C_AR183-易] 數字跑馬燈

E-tutor [程式設計][C_CH10-中] The 3n + 1 problem