C ++でのMatrixのジグザグ(または対角)トラバーサル
この問題では、2D行列が与えられます。私たちの仕事は、マトリックのすべての要素を対角線の順序で印刷することです。
問題を理解するために例を見てみましょう
1 2 3 4 5 6 7 8 9
出力-
1 4 2 7 5 3 8 6 9
マトリックスをジグザグ形式または対角形式で印刷するときに従うパターンを見てみましょう。
これが対角トラバーサルの仕組みです。
出力の行数は、常に2Dマトリックスの行と列に依存します。
2Dマトリックスmat[r][c]の場合、それらはr+c-1出力ラインになります。
例
それでは、プログラムの解決策を見てみましょう。
#include <iostream> using namespace std; #define R 5 #define C 4 int min2(int a, int b) { return (a < b)? a: b; } int min3(int a, int b, int c) { return min2(min2(a, b), c);} int max(int a, int b) { return (a > b)? a: b; } void printDiagonalMatrix(int matrix[][C]){ for (int line=1; line<=(R + C -1); line++){ int start_col = max(0, line-R); int count = min3(line, (C-start_col), R); for (int j=0; j<count; j++) cout<<matrix[min2(R, line)-j-1][start_col+j]<<"\t"; cout<<endl; } } int main(){ int M[R][C] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}, {17, 18, 19, 20},}; cout<<"The matrix is : \n"; for (int i=0; i< R; i++){ for (int j=0; j<C; j++) cout<<M[i][j]<<"\t"; cout<<endl; } cout<<"\nZigZag (diagnoal) traversal of matrix is :\n"; printDiagonalMatrix(M); return 0; }
出力
The matrix is : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ZigZag (diagonal) traversal of matrix is : 1 5 2 9 6 3 13 10 7 4 17 14 11 8 18 15 12 19 16 20
-
C++のスパイラルマトリックスIII
R行とC列の2次元グリッドがあるとすると、東向きの(r0、c0)から開始します。ここで、グリッドの北西の角は最初の行と列にあり、グリッドの南東の角は最後の行と列にあります。このグリッドのすべての位置を訪問するために、時計回りのスパイラル形状で歩きます。グリッドの境界の外側にいるときは、グリッドの外側を歩き続けます(ただし、後でグリッドの境界に戻る場合があります)。グリッドの位置を表す座標のリストを、訪問した順序で見つける必要があります。したがって、グリッドが-のような場合 次に、矢印がパスになります。 これを解決するには、次の手順に従います- dirrを作成:=[[0,1]、[
-
C++でべき等行列をチェックするプログラム
行列M[r][c]が与えられた場合、「r」は行数を示し、「c」はr=cが正方行列を形成するような列数を示します。与えられた正方行列がべき等行列であるかどうかを確認する必要があります かどうか。 べき等行列 行列「M」はべき等行列と呼ばれます 行列「M」にそれ自体を掛けたものだけが同じ行列「M」を返す場合、つまり M * M=M。 以下の例のように- 上記の行列はそれ自体で乗算され、同じ行列を返すと言えます。したがって、マトリックスはIデポテンツマトリックスです。 。 例 Input: m[3][3] = { {2, -2, -4}, {-1, 3,