Giả sử chúng ta có một ma trận và phải in các phần tử theo thứ tự xoắn ốc. Bắt đầu từ hàng đầu, in toàn bộ hàng, sau đó cột cuối, hàng cuối, và cứ thế, in theo xoắn ốc. Ví dụ ma trận:
| 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 |
Kết quả: [1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16]
Để giải quyết, ta làm theo các bước:
- currRow := 0 và currCol := 0
- while currRow và currCol trong phạm vi ma trận
- for i từ currCol đến n-1
- hiển thị mat[currRow, i]
- tăng currRow 1
- for i từ currRow đến m-1
- hiển thị mat[i, n-1]
- giảm n 1
- nếu currRow < m
- for i := n-1 down to currCol
- hiển thị mat[m-1, i]
- giảm m 1
- nếu currCol < n
- for i := m-1 down to currRow
- hiển thị mat[i, currCol]
- tăng currCol 1
- for i := m-1 down to currRow
- for i := n-1 down to currCol
- for i từ currCol đến n-1
Hãy xem triển khai sau:
Ví dụ (C++)
#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++){ //in hàng đầu bình thường cout << array[currRow][i]<<" "; } currRow++; //chuyển hàng tiếp theo for (i = currRow; i < m; ++i){ //In cột cuối cout << array[i][n-1]<<" "; } n--; //cột n-1 là cột cuối hiện tại if ( currRow < m){ //khi currRow trong phạm vi, in hàng cuối for (i = n-1; i >= currCol; --i){ cout << array[m-1][i]<<" "; } m--; //giảm phạm vi hàng } if (currCol < n){ //khi currCol trong phạm vi, in cột đầu for (i = m-1; i >= currRow; --i){ cout << array[i][currCol]<<" "; } currCol++; } } } int main(){ dispSpiral(ROW, COL); }Input
[[1,2,3,4,5,6] [7,8,9,10,11,12] [13,14,15,16,17,18]]
Output
1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16