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

C++のスパイラルマトリックス


行列があり、行列要素をらせん状に印刷する必要があるとします。最初に最初の行から始めて、コンテンツ全体を印刷し、次に最後の列に続いて印刷し、次に最後の行というように、要素をらせん状に印刷します。したがって、行列が-

のような場合
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18

この場合、出力は[1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16]

のようになります。

これを解決するには、次の手順に従います-

  • currRow:=0およびcurrCol:=0

  • currRowとcurrColがマトリックス範囲内にある間

    • 範囲currColおよびn-1のiの場合

      • ディスプレイマット[currRow、i]

    • currRowを1増やします

    • 範囲currRowおよびm-1のiの場合、実行します

      • ディスプレイマット[i、n-1]

    • nを1減らします

    • currRow

      • for i:=n-1からcurrColまで、実行

        • ディスプレイマット[m-1、i]

      • mを1減らします

      • currCol

        • for i:=m-1からcurrRowまで、実行

          • ディスプレイマット[i、currCol]

        • currColを1増やします

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <iostream>
#define ROW 3
#define COL 6
using namespace std;
int array[ROW][COL] = {{1, 2, 3, 4, 5, 6},
   {7, 8, 9, 10, 11, 12},
   {13, 14, 15, 16, 17, 18}};
void dispSpiral(int m, int n){
   int i, currRow = 0, currCol = 0;
   while (currRow < ROW && currCol < COL){
      for (i = currCol; i < n; i++){ //print the first row normally
      cout << array[currRow][i]<<" ";
   }
   currRow++; //point to next row
   for (i = currRow; i < m; ++i){ //Print the last column
      cout << array[i][n-1]<<" ";
   }
   n--; //set the n-1th column is current last column
   if ( currRow < m){ //when currRow is in the range, print the last row
      for (i = n-1; i >= currCol; --i){
         cout << array[m-1][i]<<" ";
      }
      m--; //decrease the row range
   }
   if (currCol < n){ //when currCol is in the range, print the fist column
      for (i = m-1; i >= currRow; --i){
         cout << array[i][currCol]<<" ";
      }
      currCol++;
      }
   }
}
int main(){
   dispSpiral(ROW, COL);
}

入力

[[1,2,3,4,5,6]
[7,8,9,10,11,12]
[13,14,15,16,17,18]]

出力

1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16

  1. C++のスパイラルマトリックスIII

    R行とC列の2次元グリッドがあるとすると、東向きの(r0、c0)から開始します。ここで、グリッドの北西の角は最初の行と列にあり、グリッドの南東の角は最後の行と列にあります。このグリッドのすべての位置を訪問するために、時計回りのスパイラル形状で歩きます。グリッドの境界の外側にいるときは、グリッドの外側を歩き続けます(ただし、後でグリッドの境界に戻る場合があります)。グリッドの位置を表す座標のリストを、訪問した順序で見つける必要があります。したがって、グリッドが-のような場合 次に、矢印がパスになります。 これを解決するには、次の手順に従います- dirrを作成:=[[0,1]、[

  2. 与えられた行列をC++で反時計回りのスパイラル形式で印刷します

    この問題では、2次元の行列が与えられます。そして、私たちのタスクは、から反時計回りのスパイラルで行列の要素を印刷することです。 反時計回りのスパイラルフォーム −これは、左上から始まり、反時計回りに最初の右下から左上に向かって進むスパイラルトラバーサルです。 反時計回りのトラバーサルは159 13 14 15 16 12 8 4 3 2 6 10117になります。 問題を理解するために例を見てみましょう Input:    2 4 6    1 7 9    5 0 3 Output: 2 1 5 0 3 9 7 この問