題目出自 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;
//...
//移動位置
//...
}
}
旋轉:
旋轉比較難想一點,可以在紙上把座標畫出來比較好找規律。
旋轉前後的座標
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] 矩陣轉換