一尘不染

以螺旋顺序打印二维数组

algorithm

如何以螺旋顺序打印5×5二维数组?

有没有公​​式可以让我按螺旋顺序打印任何大小的数组?


阅读 521

收藏
2020-07-28

共1个答案

一尘不染

想法是将矩阵视为一系列层,右上层和左下层。要以螺旋方式打印矩阵,我们可以从这些矩阵中剥离图层,打印被剥离的部分,然后递归地调用左边部分的打印。当我们没有更多可打印的层时,递归终止。

输入矩阵:

1 2 3 4 
5 6 7 8
9 0 1 2   
3 4 5 6 
7 8 9 1

剥去右上层后:

 1 2 3 4 
       8
5 6 7  2
9 0 1  6   
3 4 5  1 
7 8 9

从子矩阵剥离左下层后:

   6 7
5  0 1   
9  4 5
3 
7 8 9

从子矩阵剥离右上层后:

    6 7
      1   
   0  5
   4

从子矩阵剥离左下层后:

  0
  4

递归终止。


C函数:

// function to print the top-right peel of the matrix and 
// recursively call the print bottom-left on the submatrix.
void printTopRight(int a[][COL], int x1, int y1, int x2, int y2) {
    int i = 0, j = 0;

    // print values in the row.
    for(i = x1; i<=x2; i++) {
        printf("%d ", a[y1][i]);
    }

    // print values in the column.
    for(j = y1 + 1; j <= y2; j++)         {
        printf("%d ", a[j][x2]);
    }

    // see if more layers need to be printed.
    if(x2-x1 > 0) {
        // if yes recursively call the function to 
        // print the bottom left of the sub matrix.
        printBottomLeft(a, x1, y1 + 1, x2-1, y2);
    }
}

// function to print the bottom-left peel of the matrix and 
// recursively call the print top-right on the submatrix.
void printBottomLeft(int a[][COL], int x1, int y1, int x2, int y2) {
    int i = 0, j = 0;

    // print the values in the row in reverse order.
    for(i = x2; i>=x1; i--) {
        printf("%d ", a[y2][i]);
    }

    // print the values in the col in reverse order.
    for(j = y2 - 1; j >= y1; j--) {
        printf("%d ", a[j][x1]);
    }

    // see if more layers need to be printed.
    if(x2-x1 > 0) {
        // if yes recursively call the function to 
        // print the top right of the sub matrix.
        printTopRight(a, x1+1, y1, x2, y2-1);
    }
}

void printSpiral(int arr[][COL]) {
    printTopRight(arr,0,0,COL-1,ROW-1);
    printf("\n");
}
2020-07-28