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

In n x n ma trận xoắn ốc bằng cách sử dụng thêm không gian O (1) trong C Program.

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 -

In n x n ma trận xoắn ốc bằng cách sử dụng thêm không gian O (1) trong C Program.

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