正の整数 n を与え、時計回りに O(1) の余分なスペースのみを使用して n x n スパイラル行列を構築します。
スパイラル行列は、スパイラルのように機能する行列です。円の原点から開始して時計回りに回転します。したがって、タスクは、2 → 4 → 6 → 8 → 10 → 12 → 14 → 1 6→ 18 から始まる O(1) 空間を使用して行列をスパイラル形式で出力することです。
以下はスパイラル行列の例です -
Input: 3 Output: 9 8 7 2 1 6 3 4 1
無限の空間を持つコードを解くのは簡単になりますが、そうではありません。 t 最適なプログラム、またはメモリと時間の両方の効率が高いコードのように効率的です。したがって、らせんの順序を維持するために、行列の上下隅に 1 つずつ、合計 4 つのループが使用されますが、行列を 2 つの部分 (右上隅と左下隅) に分割すると、これを直接使用できます。コンセプト
< p>右上半分については、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; }
上記のプログラムを実行すると、次の出力が生成されます。 -
レリー以上がC プログラムを使用して、O(1) の余分なスペースを使用して n x n のスパイラル行列を出力します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。