此題在高中生程式解題系統的題號為:b266: 矩陣翻轉與b965: 第 2 題 矩陣轉換。
筆者的解題作法:
因為題目要還原起始矩陣,所以原本的順時針旋轉要變成逆時針旋轉;翻轉一樣是上下對調。還有就是要將旋轉與翻轉的操作順序給反過來。例如原本順序是
(1)翻轉 --> (2)翻轉 --> (3)翻轉 --> (4)旋轉 --> (5)旋轉 --> (6)翻轉
就要換成底下的順序:
(6)翻轉 --> (5)旋轉 --> (4)旋轉 --> (3)翻轉 --> (2)翻轉 --> (1)翻轉
逆時針旋轉公式推導
(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; } |
沒有留言:
張貼留言