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

C++でmXn行列の左上から右下に可能なすべてのパスを出力します


この問題では、mXn 2D行列が与えられ、行列の左上から右下までのすべての可能なパスを印刷する必要があります。トラバーサルの場合、マトリックス内で右下にのみ移動できます。

トピックをよりよく理解するために例を見てみましょう-

Input:
1 3 5
2 8 9
Output:
1 -> 3 -> 5 -> 9
1 -> 3 -> 8 -> 9
1 -> 2 -> 8 -> 9

この問題を解決するために、あるセルから別のセルに移動し、上下に移動するパスを印刷します。マトリックス内の各セルに対してこれを再帰的に実行します。

再帰的アルゴリズムを実装するプログラムを見てみましょう:

#include<iostream>
using namespace std;
void printPathTPtoBR(int *mat, int i, int j, int m, int n, int *path, int pi) {
   if (i == m - 1){
      for (int k = j; k < n; k++)
         path[pi + k - j] = *((mat + i*n) + k);
      for (int l = 0; l < pi + n - j; l++)
         cout << path[l] << " ";
         cout << endl;
      return;
   }
   if (j == n - 1){
      for (int k = i; k < m; k++)
         path[pi + k - i] = *((mat + k*n) + j);
      for (int l = 0; l < pi + m - i; l++)
         cout << path[l] << " ";
      cout << endl;
      return;
   }
   path[pi] = *((mat + i*n) + j);
   printPathTPtoBR(mat, i+1, j, m, n, path, pi + 1);
   printPathTPtoBR(mat, i, j+1, m, n, path, pi + 1);
}
void findPath(int *mat, int m, int n) {
   int *path = new int[m+n];
   printPathTPtoBR(mat, 0, 0, m, n, path, 0);
}
int main() {
   int mat[2][3] = { {1, 2, 3}, {4, 5, 6} };
   cout<<"Path from top-left to bottom-rigth of matrix are :\n";
   findPath(*mat, 2, 3);
   return 0;
}

出力

行列の左上から右下へのパスは-

です。
1 4 5 6
1 2 5 6
1 2 3 6

  1. C ++でBFSを使用して、特定のソースから宛先までのすべてのパスを出力します

    この問題では、有向グラフが表示され、幅優先探索(BFS)を使用してグラフのソースから宛先までのすべてのパスを印刷する必要があります。 有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。 問題を理解するために例を見てみましょう- ソース=K宛先=P 出力 K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。 ソースから宛先までのすべてのパスを印刷するに

  2. 特定のソースから宛先までのすべてのパスをC++で出力します

    この問題では、有向グラフが与えられ、グラフのソースから宛先までのすべてのパスを印刷する必要があります。 有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。 問題を理解するために例を見てみましょう ソース=K宛先=P 出力: K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。 この問題を解決するために、深さ優先探索を使用してグラフをトラバースします。