Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 허용되는 4개의 이동으로 행렬의 왼쪽 위에서 오른쪽 아래로 모든 경로를 인쇄합니다.

<시간/>

이 문제에서 mXn 2D 행렬이 주어지고 행렬의 왼쪽 상단에서 오른쪽 하단까지 가능한 모든 경로를 인쇄해야 합니다. 탐색의 경우 왼쪽, 오른쪽, 위쪽, 아래쪽의 네 가지 방향으로 모두 이동할 수 있습니다.

오른쪽 및 위쪽 이동은 거의 사용되지 않지만 때때로 유용할 수 있습니다.

주제를 더 잘 이해하기 위해 예를 들어보겠습니다.

입력:

1 3 5

2 8 9

출력:

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;
}

출력

Path from top-left to bottom-rigth of matrix are :
1 4 5 6
1 2 5 6
1 2 3 6