使用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
廣告
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP