#37266: C++解題思路(不用用到vector或是用記憶體區段複製array)(內有旋轉和翻轉的詳解)(測試遇到問題看這裡)


roger970106@gmail.com (Roger970106)

學校 : 臺北市立建國高級中學
編號 : 240642
來源 : [210.71.78.242]
最後登入時間 :
2023-09-11 09:38:12
b266. 矩陣翻轉 -- 2016 APCS 實作題第二題 | From: [219.91.92.76] | 發表日期 : 2023-08-29 02:40

幾個常見的問題提供參考:

Q1 翻轉以後array的行數和列數會改變,但是array大小沒辦法修改?

A1 在初始化array的時候,就用行數或列數中最大的值來設定array

ex.

常使用: int arr[2][3] = {0}; //無法在改變大小
推薦:在最一初獲得R和C時,先寫:

int tmp = 0;

if(R > C) tmp = R;

else tmp = C;

在寫:

int arr[tmp][tmp] = {0};    //這樣翻轉都不會有問題 但這樣不要用.size()存取arr大小,要隨時記得自己arr現在的R和C是多少

 

Q2 測試執行給的資料怪怪的?

A2 直接隨便用一組數值測試就好 要自己改一下測試執行所用的資料,只要用:

3 2 3
1 1
3 1
1 2
1 0 0

或是

3 2 2
3 3
2 1
1 2
0 1

其中一個測試,不要直接按測試鍵


Q3 翻轉的寫法

//R C和題目所指的東西一樣
for(int i=0; i<R/2; i++){ //只需要翻轉一半的次數 而且不用擔心R為奇數 因為/會只剩下整數部分    
    for(int j=0; j<C; j++){
        //下面三行用來把值翻轉
      tmp = arr[R-i-1][j];
        arr[b_x-i-1][j] =  arr[i][j];
        arr[i][j] = tmp;
    }
}
 
Q4 (大家的重點)旋轉的寫法:
int tmp = 0; //互換R C時用
int temp[C][R] = {0};   //temp用來暫時儲存二維陣列
//翻轉
for(int j=0; j<C; j++){
    for(int k=0; k<R; k++){
    temp[j][k] = arr[k][C-j-1];
    }
}

//交換陣列長度到當前狀態
tmp = R;
R = C;
C = tmp;
//將翻轉後的陣列(temp)重新輸入回最初的陣列(arr)           
for(int i=0; i<R; i++){
    for(int j=0; j<C; j++) arr[i][j] = temp[i][j];
}
 
ZeroJudge Forum