>author: Utin ## Question ![](https://hackmd.io/_uploads/ryZHO1452.png) 網絡戰神宣稱已將5顆炸彈放置在清華大學內了,根據信件內容,已經在台達4樓的女廁發現其中一顆炸彈,上面有網絡戰神設下的方陣密碼,請你幫助警方破解正確的方陣密碼。 ### Input 第一行有兩個整數 R, C,分別代表方陣的高度與寬度 接著會有 R 列 C 行的整數,代表加密後方陣的狀態,數字不會重複(0~99) 然後會有一個整數 N,代表接下來要做幾次翻轉 接著會有 N 列的整數,分別為旋轉方陣起始位置的列、行以及寬度,最後一個數字弱是1,請順時針旋轉90度,0則逆時針旋轉90度 ### Output 輸出最後方陣的狀態,數字寬度必須設為2格 ### Constraint 2 <= R, C <= 10 1 <= N <= 1000 ### Sample Input ```= 4 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2 1 1 2 1 1 1 3 0 ``` ```= 4 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 0 0 4 1 ``` ### Sample Output ```= 1 2 3 4 5 8 12 16 9 6 7 15 13 10 11 14 ``` ```= 13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4 ``` ## 作法 雙重迴圈搭配二維陣列。 ## 常見問題 - scanf 記得取址 - 注意旋轉方向 - 輸出要用 %2d ## 解法 ```c= #include <stdio.h> int R, C, T, row, col, range, dir; int arr[15][15]; int tmp[15][15]; int main() { // input scanf("%d %d", &R, &C); for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { scanf("%d", &arr[i][j]); } } // T test cases scanf("%d", &T); while (T--) { scanf("%d %d %d %d", &row, &col, &range, &dir); // clockwise if (dir) { for (int i = row; i < row + range; i++) { for (int j = col; j < col + range; j++) { tmp[i][j] = arr[row + range - j - 1 + col][i - row + col]; } } } // counter clockwise else { for (int i = row; i < row + range; i++) { for (int j = col; j < col + range; j++) { tmp[i][j] = arr[j - col + row][col + range - i - 1 + row]; } } } // update for (int i = row; i < row + range; i++) { for (int j = col; j < col + range; j++) { arr[i][j] = tmp[i][j]; } } } // output for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { printf("%2d", arr[i][j]); printf(j == C - 1 ? "\n" : " "); } } } ```