首頁 >後端開發 >C++ >使用C程式列印n x n的螺旋矩陣,使用O(1)額外空間

使用C程式列印n x n的螺旋矩陣,使用O(1)額外空間

WBOY
WBOY轉載
2023-09-06 11:53:08816瀏覽

給定一個正整數n,並建構一個n x n 的螺旋矩陣,僅在順時針方向上使用O(1) 額外空間

螺旋矩陣是一個像螺旋一樣工作的矩陣,它將開始從圓的原點開始,順時針方向旋轉。因此,任務是使用從 2 → 4 → 6 → 8 → 10 → 12 → 14 → 1 6→ 18 開始的 O(1) 空間以螺旋形式列印矩陣。

下面是範例螺旋矩陣-

使用C程序打印n x n的螺旋矩阵,使用O(1)额外空间

範例

Input: 3
Output:
   9 8 7
   2 1 6
   3 4 1

解決具有無限空間的程式碼變得很容易,但這並不像最佳程式那樣有效,或者程式碼在記憶體和時間上都是有效的。因此,為了保持螺旋順序,使用了四個循環,每個循環用於矩陣的上、右、下和左角,但是如果我們將矩陣分為兩部分,即右上角和左下角,我們可以直接使用這個概念

對於右上半部分,
mat[i][j] = (n-2*x)*(n-2*x)-(i-x)-(j-x)

對於左下半部分,

mat[i][j] = (n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)

注意-我們正在編寫用於列印2的矩陣倍數的程式

演算法

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

範例

#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("</p><p>");
   }
}
int main(int argc, char const *argv[]){
   int n = 3;
   spiralmatrix(n);
   return 0;
}

輸出

如果我們執行上面的程序,那麼它將產生以下輸出-

18 16 14
4 2 12
6 8 10

以上是使用C程式列印n x n的螺旋矩陣,使用O(1)額外空間的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除