#34468: 純C解法參考


910238@hshs.ntpc.edu.tw (學生蘇立劼)

學校 : 不指定學校
編號 : 229246
來源 : []
最後登入時間 :
2023-03-21 19:56:27
b266. 矩陣翻轉 -- 2016 APCS 實作題第二題 | From: [111.250.198.201] | 發表日期 : 2023-03-21 20:28

個人認為難點在旋轉的思路:

原矩陣a[][]

r(2) X c(3)

000102
101112

逆時針轉90度後

b[][]

c(3) X r(2)

0212
0111
0010

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");
    }
}

 
#37729: Re: 純C解法參考


dadin852@gmail.com (黃少遠)

學校 : 不指定學校
編號 : 207501
來源 : [140.122.105.200]
最後登入時間 :
2023-10-03 15:19:24
b266. 矩陣翻轉 -- 2016 APCS 實作題第二題 | From: [140.122.105.200] | 發表日期 : 2023-10-03 15:21

🙏 感恩

 
ZeroJudge Forum