如何以螺旋顺序打印5×5二维数组?
有没有公式可以让我按螺旋顺序打印任何大小的数组?
想法是将矩阵视为一系列层,右上层和左下层。要以螺旋方式打印矩阵,我们可以从这些矩阵中剥离图层,打印被剥离的部分,然后递归地调用左边部分的打印。当我们没有更多可打印的层时,递归终止。
输入矩阵:
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"); }