Computer >> Máy Tính >  >> Lập trình >> Lập trình

In ma trận theo cách xoắn ốc


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