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

Ma trận xoắn ốc trong C ++


Giả sử chúng ta có một ma trận và chúng ta phải in các phần tử của ma trận 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 đó đi 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. Vì vậy, nếu ma trận giống như -

1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18

Khi đó đầu ra sẽ có dạng [1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16]

Để giải quyết vấn đề này, chúng ta sẽ làm theo các bước sau -

  • currRow:=0 và currCol:=0

  • trong khi currRow và currCol nằm trong phạm vi ma trận

    • cho tôi trong phạm vi currCol và n-1,

      • tấm chiếu [currRow, i]

    • tăng currRow lên 1

    • đối với tôi trong phạm vi currRow và m-1, hãy thực hiện

      • tấm chiếu [i, n-1]

    • giảm n đi 1

    • nếu currRow

      • for i:=n-1 down to currCol, do

        • tấm chiếu [m-1, i]

      • giảm m đi 1

      • nếu currCol

        • for i:=m-1 down to currRow, do

          • tấm chiếu [i, currCol]

        • tăng currCol lên 1

Ví dụ (C ++)

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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 vào

[[1,2,3,4,5,6]
[7,8,9,10,11,12]
[13,14,15,16,17,18]]

Đầu ra

1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16