---
# System prepended metadata

title: 清大拆彈專家
tags: [Day2]

---

>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" : " ");
        }
    }
}
```
