使用C語言程式,用O(1)的額外空間列印nxn螺旋矩陣。


給定一個正整數n,我們建立一個nxn的螺旋矩陣,只使用O(1)的額外空間,按照順時針方向。

螺旋矩陣是一個像螺旋一樣工作的矩陣,它從圓的原點開始,並以順時針方向旋轉。因此,任務是從2→4→6→8→10→12→14→16→18開始,使用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("
");    } } int main(int argc, char const *argv[]){    int n = 3;    spiralmatrix(n);    return 0; }

輸出

如果我們執行上面的程式,它將生成以下輸出:

18 16 14
4 2 12
6 8 10

更新於:2019年8月22日

377 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.