อัลกอริทึมนี้ใช้เพื่อพิมพ์องค์ประกอบอาร์เรย์ในลักษณะเกลียว ในตอนแรกเริ่มต้นจากแถวแรก ให้พิมพ์เนื้อหาทั้งหมดแล้วตามด้วยคอลัมน์สุดท้ายเพื่อพิมพ์ จากนั้นจึงพิมพ์แถวสุดท้ายและต่อไปเรื่อยๆ ดังนั้นจึงพิมพ์องค์ประกอบในลักษณะเกลียว
ความซับซ้อนของเวลาของอัลกอริทึมนี้คือ 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