Mô tả bài toán
Cho ma trận vuông NxN, trả về mảng 1 chiều theo thứ tự xoáy ốc từ ngoài vào trung tâm (theo chiều kim đồng hồ).
Ví dụ minh họa
const arr = [
[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]
];
const spiralForm = arr => {
return arr.length > 1 ?
arr.splice(0, 1)[0]
.concat(spiralForm(
arr[0].map((c, i) => arr.map(r => r[i]))
.reverse()
)) :
arr[0];
};
console.log(spiralForm(arr));
Kết quả
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ]
Giải thích thuật toán
- Lấy hàng đầu tiên (top row)
- Xoay ma trận còn lại 90° ngược chiều kim đồng hồ (transpose + reverse)
- Đệ quy cho đến khi ma trận còn 1 hàng
Lưu ý
Phương pháp này thay đổi mảng gốc (splice). Nên copy mảng nếu cần giữ nguyên.