Chúng ta được cho một số nguyên dương n và tạo một ma trận xoắn ốc n x n, chỉ sử dụng thêm O (1) không gian theo chiều kim đồng hồ
Ma trận xoắn ốc là một ma trận hoạt động giống như một đường xoắn ốc bắt đầu từ điểm gốc của một đường tròn và quay theo chiều kim đồng hồ. Vì vậy, nhiệm vụ là in ma trận ở dạng xoắn ốc sử dụng không gian O (1) bắt đầu từ 2 → 4 → 6 → 8 → 10 → 12 → 14 → 1 6 → 18.
Dưới đây là ví dụ về ma trận xoắn ốc -
Ví dụ
Input: 3 Output: 9 8 7 2 1 6 3 4 1
Việc giải mã trở nên dễ dàng với không gian không giới hạn nhưng điều đó không hiệu quả bằng chương trình tốt nhất hoặc mã là chương trình hiệu quả về bộ nhớ và thời gian. Vì vậy, để duy trì thứ tự xoắn ốc, bốn vòng được sử dụng, mỗi vòng cho góc trên cùng, bên phải, dưới cùng và bên trái của ma trận nhưng Nếu chúng ta chia ma trận thành hai phần, tức là phía trên bên phải và phía dưới bên trái, chúng ta có thể sử dụng trực tiếp khái niệm
Đối với nửa trên bên phải,
mat[i][j] = (n-2*x)*(n-2*x)-(i-x)-(j-x)
Đối với nửa dưới bên trái,
mat[i][j] = (n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)
Lưu ý - Chúng tôi đang viết chương trình để in bội số ma trận của 2
Thuật toán
int spiralmatrix(int n) START STEP 1: DECLARE i, j, a, b, x STEP 2: LOOP FOR i = 0 AND i < n AND i++ LOOP FOR j = 0 AND j < n AND j++ FIND THE MINIMUM IN (i<j ) AND ASSIGN IT TO a FIND THE MINIMUM (n-1-i) < (n-1-j) AND ASSIGN IT TO b THEN ASSIGN THE LEAST VALUE FROM a AND b TO x IF i <= j THEN, PRINT THE VALUE OF 2* ((n-2*x)*(n-2*x) - (i-x) - (j-x)) ELSE PRINT THE VALUE OF 2*((n-2*x-2)*(n-2*x2) + (i-x) + (j-x)) END LOOP PRINT NEWLINE END LOOP STOP
Ví dụ
#include <stdio.h> //For n x n spiral matrix int spiralmatrix(int n){ int i, j, a, b, x; // x stores the layer in which (i, j)th element exist for ( i = 0; i < n; i++){ for ( j = 0; j < n; j++){ // Finds minimum of four inputs a = ((i<j ? i : j)); b = ((n-1-i) < (n-1-j) ? (n-1-i) : (n-1-j)); x = a < b ? a : b; // For upper right half if (i <= j) printf("%d\t ", 2 * ((n-2*x)*(n-2*x) - (i-x) - (j-x))); // for lower left half else printf("%d\t ", 2*((n-2*x-2)*(n-2*x-2) + (i-x) + (j-x))); } printf("\n"); } } int main(int argc, char const *argv[]){ int n = 3; spiralmatrix(n); return 0; }
Đầu ra
Nếu chúng ta chạy chương trình trên thì nó sẽ tạo ra kết quả sau -
18 16 14 4 2 12 6 8 10