Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

พิมพ์เมทริกซ์ในลักษณะเกลียว


อัลกอริทึมนี้ใช้เพื่อพิมพ์องค์ประกอบอาร์เรย์ในลักษณะเกลียว ในตอนแรกเริ่มต้นจากแถวแรก ให้พิมพ์เนื้อหาทั้งหมดแล้วตามด้วยคอลัมน์สุดท้ายเพื่อพิมพ์ จากนั้นจึงพิมพ์แถวสุดท้ายและต่อไปเรื่อยๆ ดังนั้นจึงพิมพ์องค์ประกอบในลักษณะเกลียว

ความซับซ้อนของเวลาของอัลกอริทึมนี้คือ O(MN), M คือจำนวนแถวและ N คือจำนวนคอลัมน์

อินพุตและเอาต์พุต

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

อัลกอริทึม

dispSpiral(mat, m, n)

ป้อนข้อมูล: แผ่นเมทริกซ์ แถวและคอลัมน์ m และ n

ผลลัพธ์: พิมพ์องค์ประกอบของเมทริกซ์ในลักษณะเกลียว

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

ตัวอย่าง

#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);
}

ผลลัพธ์

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