Thuật toán này được sử dụng để in các phần tử của mảng theo cách xoắn ốc. Lúc đầu, bắt đầu từ hàng đầu tiên, in toàn bộ nội dung và sau đó theo cột cuối cùng để in, sau đó đến hàng cuối cùng, v.v., do đó nó in các phần tử theo kiểu xoắn ốc.
Độ phức tạp về thời gian của thuật toán này là O (MN), M là số hàng và N là số cột.
Đầu vào và Đầu ra
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
Thuật toán
dispSpiral(mat, m, n)
Đầu vào: Mat ma trận, hàng và cột m và n.
Đầu ra: In các phần tử của ma trận theo cách xoắn ốc.
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
Ví dụ
#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); }
Đầu ra
1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16