APCS 實作題 10503 第2題矩陣轉換參考解法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此題在高中生程式解題系統的題號為:b266: 矩陣翻轉b965: 第 2 題 矩陣轉換

筆者的解題作法:
因為題目要還原起始矩陣,所以原本的順時針旋轉要變成逆時針旋轉;翻轉一樣是上下對調。還有就是要將旋轉與翻轉的操作順序給反過來。例如原本順序是
(1)翻轉 --> (2)翻轉 --> (3)翻轉 --> (4)旋轉 --> (5)旋轉 --> (6)翻轉

就要換成底下的順序:
(6)翻轉 --> (5)旋轉 --> (4)旋轉 --> (3)翻轉 --> (2)翻轉 --> (1)翻轉

逆時針旋轉公式推導

翻轉公式推導


C程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <stdlib.h>

int d[10][10];

void prt(int R, int C)
{
    for(int i = 0; i < R; i++)
    {
        printf("%d", d[i][0]);
        for(int j = 1; j < C; j++)
            printf(" %d", d[i][j]);

        printf("\n");
    }
}

// 逆時針方向旋轉
// 旋轉後的 r',等於轉換前的 c。
// 旋轉後的 c',等於 原本矩陣行數(C)-j-1。
void rotate(int R, int C)
{
    int b[10][10];
    int i, j;

    for(i = 0; i < R; ++i)
        for(j = 0; j < C; ++j)
            b[C-1-j][i] = d[i][j];

    //printf("\n\n");
    for(i = 0; i < C; i++)
        for(j = 0; j < R; j++)
            d[i][j] = b[i][j];

    //prt(d, C, R);
    //printf("\n\n");
}

// 上下翻轉
// 翻轉後的 r',等於原本矩陣列數(R)-i-1。
// 翻轉後的 c',等於c。
void flip(int R, int C)
{
    int b[10][10];
    int i, j;

    for(i = 0; i < R; ++i)
        for(j = 0; j < C; ++j)
            b[R-1-i][j] = d[i][j];

    for(i = 0; i < R; i++)
        for(j = 0; j < C; j++)
            d[i][j] = b[i][j];

    //prt(d, R, C);
    //printf("\n\n");
}

int main(void)
{
    int R, C, M, op[10];

    while (scanf("%d%d%d",&R, &C, &M) != EOF )
    {
        for(int i = 0; i < R; i++)
        {
            for(int j = 0; j < C; j++)
                scanf("%d", &d[i][j]);
        }

        for(int i = 0; i < M; i++)
        {
            scanf("%d", &op[i]);
        }

        for(int i = M - 1; i >= 0; i--)
        {
            if(op[i] == 0)
            {
                rotate(R, C);
                int t = R;
                R = C;
                C = t;
            }
            else
                flip(R, C);
        }

        printf("%d %d\n", R, C);
        prt(R, C);

    }

    return 0;
}

沒有留言:

張貼留言