iT邦幫忙

0

[C++][APCS] 矩陣轉換

題目出自 APCS 網站 > 試題範例 > 2016-03-05_實作題 > 第二題 成績指標
連結

解答僅供參考

解答:

#include <stdio.h>
#include <stdlib.h>

//翻轉矩陣
//matrix       : 矩陣
//currentIndex : 矩陣當前位置
//size         : 矩陣最大邊長
//size_x       : 矩陣 x 軸長度
//size_y       : 矩陣 y 軸長度
void TurnOver(int *matrix, int currentIndex, int size, int size_x, int size_y)
{
    int _currentIndex = 1 - currentIndex;
    int _i, _j;
    for (int i = 0; i < size_x; i++)
    {
        for (int j = 0; j < size_y; j++)
        {
            _i = size_x - i - 1;
            _j = j;

            *(matrix + _currentIndex * size * size + _i * size + _j) = 
            *(matrix + currentIndex * size * size + i * size + j);
        }
    }
}

//旋轉矩陣
//matrix       : 矩陣
//currentIndex : 矩陣當前位置
//size         : 矩陣最大邊長
//size_x       : 矩陣 x 軸長度
//size_y       : 矩陣 y 軸長度
void Rotate(int *matrix, int currentIndex, int size, int size_x, int size_y)
{
    int _currentIndex = 1 - currentIndex;
    int _i, _j;
    for (int i = 0; i < size_x; i++)
    {
        for (int j = 0; j < size_y; j++)
        {
            _i = j;
            _j = size_x - i - 1;

            *(matrix + _currentIndex * size * size + _i * size + _j) = 
            *(matrix + currentIndex * size * size + i * size + j);
        }
    }
}

int main(void)
{
    int r, c, m;
    scanf("%d %d %d", &r, &c, &m);

    //取得最大邊長
    int size = r > c ? r : c;
    int matrix[2][size][size];

    //當前矩陣位置
    int currentIndex = 0;

    //讀取矩陣
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            scanf("%d", &matrix[currentIndex][i][j]);
        }
    }

    //讀取操作
    int operate[m];
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &operate[i]);
    }

    //操作矩陣
    for (int i = 0; i < m; i++)
    {
        if (operate[i] == 1)
        {
            //翻轉
            TurnOver(&matrix[0][0][0], currentIndex, size, r, c);
        }
        else
        {
            //旋轉
            Rotate(&matrix[0][0][0], currentIndex, size, r, c);
            //旋轉後對調邊長
            r = r ^ c;
            c = r ^ c;
            r = r ^ c;
        }
        //切換當前矩陣
        currentIndex = 1 - currentIndex;
    }

    //印出結果
    printf("%d %d\n", r, c);

    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            printf("%d", matrix[currentIndex][i][j]);
            if (j < c - 1)
            {
                printf(" ");
            }
        }
        printf("\n");
    }

    system("pause");
    return 0;
}

輸入:

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

輸出:

3 2
1 1
1 3
2 1
2 3
2 1 3
1 2 3

說明:
程式內使用兩個矩陣來做搬移動作,每次翻轉旋轉都會把舊矩陣的值移動到新矩陣,在使用 currentIndex 來記錄當前的新矩陣。

翻轉:
翻轉的邏輯比較簡單,只要找出矩陣要對調的上下兩座標,然後將裡面的值對調就可以完成翻轉。

//_i 為新的 x 軸座標
//_j 為新的 y 軸座標

int _i, _j;
for (int i = 0; i < size_x; i++)
{
    for (int j = 0; j < size_y; j++)
    {
        _i = size_x - i - 1;
        _j = j;
        
        //...
        //移動位置
        //...
    }
}

旋轉:
旋轉比較難想一點,可以在紙上把座標畫出來比較好找規律。
https://ithelp.ithome.com.tw/upload/images/20171216/20106865tBItOe9UAc.jpg
旋轉前後的座標

A (0,0) => (0,2)
B (1,0) => (0,1)
C (2,0) => (0,2)
D (0,1) => (1,2)
E (1,1) => (1,1)
F (2,1) => (1,0)

從上面的結果可以看出,
旋轉後的 x 軸座標 等於轉換前的 y 軸座標
旋轉後的 y 軸座標 等於 x 軸邊長 減去 x 軸座標 再減一。

//_i 為新的 x 軸座標
//_j 為新的 y 軸座標

int _i, _j;
for (int i = 0; i < size_x; i++)
{
    for (int j = 0; j < size_y; j++)
    {
        _i = j;
        _j = size_x - i - 1;
        
        //...
        //移動位置
        //...
    }
}

相關文章:
[C++][APCS] 成績指標
[C++][APCS] 矩陣轉換


尚未有邦友留言

立即登入留言