藍橋杯的回形取數(C語言)

題目

問題描述
  回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。
輸入格式
  輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。
輸出格式
  輸出只有一行,共mn個數,爲輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。
樣例輸入
3 3
1 2 3
4 5 6
7 8 9
樣例輸出
1 4 7 8 9 6 3 2 5
樣例輸入
3 2
1 2
3 4
5 6
樣例輸出
1 3 5 6 4 2

說明

利用循環結構,從數組的(0,0)個元素開始,依次向下輸出,向右輸出,向上輸出,向左輸出,此時爲第t==0圈輸出結束;然後從(1,1)開始,再次執行以上步驟,不斷循環,直到count==0跳出循環。
記得return 0 啊 T_T

代碼及註釋

#include<stdio.h>
int main() {
    int n,m,count;
    scanf("%d%d",&n,&m);
    count=n*m;
    int a[n][m],i,j;
    for(i=0; i<n; i++) {
        for(j=0; j<m; j++) {
            scanf("%d",&a[i][j]);
        }
    }
    //**********以上是數的輸入**************
    int t=0;//t用於記錄圈數
    i=0;//數的橫座標
    j=0;//數的縱座標
    while(count) {
    //省略if(i==t&&j==t&&count),判斷座標是否在左上角的節點,因爲條件必然成立
        while(i<n-t&&count) {//從左上角向下走
            if(i==0&&j==0) {//第一個數的輸出格式
                printf("%d",a[0][0]);
                i++;
            } else
                printf(" %d",a[i++][j]);
            count--;
        }
        i--;
        j++;
        //省略if(i==n-1-t&&j==t),左下角的節點的判斷
        while(j<m-t&&count) {//向右走
            printf(" %d",a[i][j++]);
            count--;
        }
        j--;
        i--;
        //省略if(i==n-1-t&&j==m-1-t&&count),右下角節點的判斷
        while(i>=t&&count) {//向上走
            printf(" %d",a[i--][j]);
            count--;
        }
        i++;
        j--;
        //省略if(i==t&&j==m-1-t),右上角節點的判斷
        while(j>t&&count) {//向左走
            printf(" %d",a[i][j--]);
            count--;
        }
        j++;
        i++;
        t++;//圈數加一
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章