C語言實現矩陣螺旋輸出

何時年薪百萬發表於2020-12-20

C語言實現矩陣螺旋輸出

題目描述
給定一個m行、n列的矩陣,請按照順時針螺旋的順序輸出矩陣中所有的元素(從[0][0]位置開始,具體請參見下圖):
在這裡插入圖片描述
輸入格式要求:
每次程式執行時,首先在第一行輸入2個整數,分別對應題目描述中的m和n,(1<=m, n<=100),之間用一個空格分隔。接下來輸入m行,每行包含n個整數,每兩個整數之間用一個空格分隔。

輸出格式要求:
輸出為一行,包括m*n個整數,按照題目要求的順序依次輸出所有矩陣元素,任意兩個整數之間用一個空格分隔,最後一個整數後面沒有空格。

思路:
順時針螺旋輸出的過程可以看作一系列“向右-向下-向左-向上”進行輸出的過程,只不過在這個過程中,要確保輸出過的元素不被重複地訪問和輸出。可以把每次沿著一個方向的輸出看成一個獨立過程,考慮到每沿著一個方向輸出後剩餘的待輸出部分還是一個矩陣,你也可以通過四個變數分別記錄現在還沒被輸出的矩陣的行數和列數可能的最小值、最大值。也可以用另一個等大的二維陣列來標記對應位置的數字是否已經被輸出了。

程式碼:

#include <stdio.h>
void space(int, int);
int main() {
    int matrix[101][101];
    int m;
    int n;
    int i, j;
    // 輸入m*n的矩陣
    scanf("%d%d", &m, &n);
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    //定義上下左右邊界,每次邊上的數後,更新周圍的值
    int up = 0, left = 0, down = m-1, right = n-1;
    int k, num = 0;
    while (up <= down && left <= right) {
        // 向右輸出
        for (k = left; k <= right; k++) {
            printf("%d", matrix[up][k]);
            num++;
            space(num, m*n);
        }
        up++;
        if (num == m*n)  //如果全部數值已經輸出完畢,退出while迴圈
            break;
        // 向下輸出
        for (k = up; k <= down; k++) {
            printf("%d", matrix[k][right]);
            num++;
            space(num, m*n);
        }
        right--;
        if (num == m*n)  //如果全部數值已經輸出完畢,退出while迴圈
            break;
        // 向左輸出
        for (k = right ; k >= left; k--) {
            printf("%d", matrix[down][k]);
            num++;
            space(num, m*n);
        }
        down--;
        if (num == m*n)  //如果全部數值已經輸出完畢,退出while迴圈
            break;
        // 向上輸出
        for (k = down; k >= up; k--) {
            printf("%d", matrix[k][left]);
            num++;
            space(num, m*n);
        }
        left++;
        if (num == m*n)  //如果全部數值已經輸出完畢,退出while迴圈
            break;
    }
    return 0;
}
//判斷每次輸出數字後是否要輸出空格
void space(num, all) {
    if (num < all)
        printf(" ");
}

相關文章