螺旋打印矩阵
该算法用于以螺旋方式打印数组元素。首先,从第一行开始,先打印全部内容,然后按照最后一列打印,然后再最后一行,依此类推,从而以螺旋方式打印元素。
该算法的时间复杂度为O(MN),M为行数,N为列数。
输入输出
Input: The matrix: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Output: Contents of an array as the spiral form 1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16
算法
dispSpiral(mat, m, n)
输入: 矩阵矩阵,行和列m和n。
输出:以螺旋方式打印矩阵的元素。
Begin currRow := 0 and currCol := 0 while currRow and currCol are in the matrix range, do for i in range currCol and n-1, do display mat[currRow, i] done increase currRow by 1 for i in range currRow and m-1, do display mat[i, n-1] done decrease n by 1 if currRow < m, then for i := n-1 down to currCol, do display mat[m-1, i] done decrease m by 1 if currCol < n, then for i := m-1 down to currRow, do display mat[i, currCol] done increase currCol by 1 done End
示例
#include <iostream> #define ROW 3 #define COL 6 using namespace std; int array[ROW][COL] = { {1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}, {13, 14, 15, 16, 17, 18} }; void dispSpiral(int m, int n) { int i, currRow = 0, currCol = 0; while (currRow < ROW && currCol <COL) { for (i = currCol; i < n; i++) { //print the first row normally cout << array[currRow][i]<<" "; } currRow++; //point to next row for (i = currRow; i < m; ++i) { //Print the last column cout << array[i][n-1]<<" "; } n--; //set the n-1th column is current last column if ( currRow< m) { //when currRow is in the range, print the last row for (i = n-1; i >= currCol; --i) { cout << array[m-1][i]<<" "; } m--; //decrease the row range } if (currCol <n) { //when currCol is in the range, print the fist column for (i = m-1; i >= currRow; --i) { cout << array[i][currCol]<<" "; } currCol++; } } } int main() { dispSpiral(ROW, COL); }
输出结果
1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16