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

C++での対角トラバース


M x N個の要素の行列があるとすると、行列のすべての要素を対角順に見つける必要があります。したがって、行列が-

のような場合
1 2 3
4 5 6
7 8 9

出力は[1,2,4,7,5,3,6,8,9]

になります

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

  • 配列をretにし、row:=0およびcol:=0、n:=row count、m:=col count、down:=falseを設定します
  • 0からn–1の範囲のiの場合
    • x:=i、y:=0
    • 配列の一時を作成する
    • x> =0かつy
    • matrix [x、y]をtempに挿入し、xを1減らし、yを1増やします
  • downがtrueの場合、一時配列を逆にします
  • 範囲0からtemp– 1のサイズのiの場合、temp[i]をretに挿入します
  • ダウン:=ダウンの逆
  • 1からm–1の範囲のiの場合
    • x:=n – 1、y:=1、配列tempを作成します
    • x> =0かつy
    • matrix [x、y]をtempに挿入し、xを1減らし、yを1増やします
  • 範囲0からtemp– 1のサイズのiの場合、temp[i]をretに挿入します
  • ダウン:=ダウンの逆
  • returnret。
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<int> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
       public:
       vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
          vector <int> ret;
          int row = 0;
          int col = 0;
          int n = matrix.size();
          int m = n? matrix[0].size() : 0;
          bool down = false;
          for(int i = 0; i < n; i++){
             int x = i;
             int y = 0;
             vector <int> temp;
             while(x >= 0 && y < m){
                temp.push_back(matrix[x][y]);
                x--;
                y++;
             }
             if(down) reverse(temp.begin(), temp.end());
             for(int i = 0; i < temp.size(); i++)ret.push_back(temp[i]);
             down = !down;
          }
          for(int i = 1; i < m; i++){
             int x = n - 1;
             int y = i;
             vector <int> temp;
             while(x >= 0 && y < m){
                temp.push_back(matrix[x][y]);
                x--;
                y++;
             }
             if(down) reverse(temp.begin(), temp.end());
             for(int i = 0; i < temp.size(); i++)ret.push_back(temp[i]);
             down = !down;
          }
          return ret;
       }
    };
    main(){
       vector<vector<int>> v = {{1,2,3},{4,5,6},{7,8,9}};
       Solution ob;
       print_vector(ob.findDiagonalOrder(v));
    }

    入力

    [[1,2,3],[4,5,6],[7,8,9]]

    出力

    [1, 2, 4, 7, 5, 3, 6, 8, 9, ]

    1. C ++でのMatrixのジグザグ(または対角)トラバーサル

      この問題では、2D行列が与えられます。私たちの仕事は、マトリックのすべての要素を対角線の順序で印刷することです。 問題を理解するために例を見てみましょう 1    2    3 4    5    6 7    8    9 出力- 1 4    2 7    5    3 8    6 9 マトリックスをジグザグ形式または対角形式で印刷するときに従うパターンを見てみましょう。 こ

    2. C++で上部の対角線を下部と交換します

      このチュートリアルは、c ++コードを使用して、3つの対角配列の上の行を下の行に交換するように設計されています。さらに、3対角配列が入力である場合、切望される結果は次のようなものでなければなりません。 このために、アクションのコースは次のようにアルゴリズムで簡単に説明されます; アルゴリズム Step-1: Input a diagonal array Step-2: Pass it to Swap() method Step-3: Traverse the outer loop till 3 Step-4: increment j= i+ 1 in the inner loop t