Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Ma trận xoắn ốc (Spiral Matrix) trong C++

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:

123456
789101112
131415161718

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

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