Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

CプログラムでO(1)の余分なスペースを使用して、nxnスパイラル行列を出力します。


正の整数nが与えられ、時計回りにO(1)の余分なスペースのみを使用して、nxnのスパイラル行列を作成します

スパイラル行列は、円の原点から始まり時計回りに回転するスパイラルのように機能する行列です。したがって、タスクは、2→4→6→8→10→12→14→16→18から始まるO(1)スペースを使用して、行列をスパイラル形式で印刷することです。

以下にスパイラル行列の例を示します-

CプログラムでO(1)の余分なスペースを使用して、nxnスパイラル行列を出力します。

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

無制限のスペースでコードを解くのは簡単になりますが、最高のプログラムまたはコードはメモリと時間の両方で効率的なものであるため、それは効率的ではありません。したがって、スパイラル順序を維持するために、マトリックスの右上隅、右隅、左隅にそれぞれ4つのループが使用されますが、マトリックスを2つの部分、つまり右上と左下に分割すると、概念を直接使用できます

右上半分については

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

出力

上記のプログラムを実行すると、次の出力が生成されます-

18 16 14
4 2 12
6 8 10

  1. Cプログラムで行列を斜め下向きに印刷します。

    サイズnxnの配列が与えられ、タスクは整数型の行列要素を対角線下に印刷することです。 斜め下向きとは、下の図のように、任意のサイズのnxnの配列を斜め下向きに印刷することを意味します- 最初に1を印刷し、次に2に移動して印刷し、対角線上に4に移動して、以下同様に印刷します。 例 Input: Matrix [3][3] = {    { 1, 2, 3 },    { 4, 5, 6 },    { 7, 8, 9 }} Output: 1 2 4 3 5 7 6 8 9 アルゴリズム int diagonally_down

  2. Cプログラムで余分なスペースや変更を加えずに、リンクリストの裏面を印刷します。

    タスクは、余分なスペースを使用せずにリンクリストの最後からノードを印刷することです。つまり、余分な変数はなく、最初のノードを指すヘッドポインターが移動します。 例 Input: 10 21 33 42 89 Output: 89 42 33 21 10 再帰的アプローチ(余分なスペースを使用)、リンクリストの反転(指定されたリンクリストの変更が必要)、スタック上の要素のプッシュ、要素のポップと表示など、リンクリストを逆の順序で印刷するソリューションは多数あります。 1つずつ(スペースO(n)が必要)、これらのソリューションはO(1)よりも多くのスペースを使用しているようです。 O(