個人認為難點在旋轉的思路:
原矩陣a[][]
r(2) X c(3)
00 | 01 | 02 |
10 | 11 | 12 |
逆時針轉90度後
b[][]
c(3) X r(2)
02 | 12 |
01 | 11 |
00 | 10 |
b[c-1-i][j] = a[j][i];
a的橫行會轉換成b的直列且反轉(由尾到頭) 例a[i][j](i = 0、j = 0~c-1) 是b[j][i](i = 0、j = c-1~0)
另外主程式中用來判斷執行翻轉或旋轉的for迴圈不可以使用全域的變數i,會引響turn和roll的執行。
以下是我的程式碼:
(a[10][10] 為題目中B矩陣)
#include<stdio.h>
int i,j,tmp;
int r,c,m;
int a[10][10];
int b[10][10];
int mode[10];
void turn(void){
for(i=0;i<(r/2);i++){
for(j=0;j<c;j++){
tmp = a[i][j];
a[i][j] = a[r-1-i][j];
a[r-1-i][j] = tmp;
}
}
}
void roll(void){
for(j=0;j<r;j++){
for(i=0;i<c;i++){
b[c-1-i][j] = a[j][i];
}
}
tmp = r;
r = c;
c = tmp;
for(i=0;i<r;i++){
for(j=0;j<c;j++){
a[i][j] = b[i][j];
}
}
}
int main(){
scanf("%d%d%d",&r,&c,&m);
for(i=0;i<r;i++){
for(j=0;j<c;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++){
scanf("%d",&mode[i]);
}
for(int k=m-1;k>=0;k--){
if(mode[k] == 0){
roll();
}
if(mode[k] == 1){
turn();
}
}
printf("%d %d \n",r,c);
for(i=0;i<r;i++){
for(j=0;j<c;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}