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

C++의 미로에서 목적지에 도달하는 방법의 수 세기

<시간/>

장애물이 -1로 표시되고 투명 셀이 -1이 아닌 값을 갖는 행 X 열 행렬로 표현되는 미로가 주어집니다. 목표는 첫 번째 셀 arr[0][0]에서 시작하여 두 번의 이동만 허용되도록 마지막 셀 arr[row][col]에 도달하는 것입니다.

  • arr[i][j]를 arr[i][j+1]로 오른쪽 이동하고
  • arr[i][j]를 arr[i+1][j]로 아래로 이동합니다.

예를 들어 이해합시다.

입력 - arr[행][열] ={{0, 0, 0}, {-1, -1, 0}, {0, 0, 0}}

출력 - 미로에서 목적지에 도달하는 방법의 수는 다음과 같습니다. 1

설명

0 1 2

0 0 0 0

1 -1 -1 0

2 0 0 0

방법은 다음과 같습니다.

  • 셀(0,0) → 셀(0,1) → 셀(0,2) → 셀(1,2) → 셀(2,0)

입력 - arr[행][열] ={ {0, 0, 0, 0}, {-1, 0, -1, 0}, {-1, 0, -1, 0}, {0, 0, 0, 0}}

출력 - 미로에서 목적지에 도달하는 방법의 수는 다음과 같습니다. 2

설명

0 1 2 3

0 0 0 0 0

1 -1 0 -1 0

2 -1 0 -1 0

3 0 0 0 0

방법은 다음과 같습니다.

  • 셀(0,0) → 셀(0,1) → 셀(1,1) → 셀(2,1) → 셀(3,1) → 셀(3,2) → 셀(3,3) )
  • 셀(0,0) → 셀(0,1) → 셀(0,2) → 셀(0,3) → 셀(1,3) → 셀(2,3) → 셀(3,3) )

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

이 접근 방식에서는 먼저 모든 0을 1로 설정합니다. 각 셀에 대해 다시 미로 행렬을 탐색하고 차단(-1)이면 무시합니다. 그렇지 않은 경우 위쪽 셀(i-1,j)과 왼쪽 셀(i,j-1)을 확인합니다. 0보다 크면 현재 셀(i,j)에 값을 추가합니다. 이런 식으로 셀(row-1,col-1)에서 합계를 도달하는 총 방법으로 얻습니다.

  • 입력 배열 arr[row][col]을 Maze로 사용합니다.
  • destination_maze(int arr[row][col]) 함수는 arr을 받아 미로에서 목적지에 도달하는 방법의 수를 반환합니다.
  • 첫 번째 셀이 차단되면 끝까지 도달하는 방법으로 0을 반환합니다.
  • 이제 가장 왼쪽 열을 탐색하고 모든 0을 1로 설정합니다. 처음에는 차단으로 인해 루프 아래에 있는 셀에 도달할 수 없으므로 루프가 중단됩니다. 인덱스 i=0에서 i
  • j=0에서 j
  • 셀(1,1)에서 arr을 다시 탐색하고 arr[i][j]가 -1이면 아무 것도 하지 않습니다.
  • arr[i-1][j] 또는 arr[i][j-1]이 0보다 크면 arr[i][j]에 도달할 수 있습니다. 가치를 더하세요.
  • 마지막에 도달하는 전체 방법으로 arr[row-1][col-1]이 있습니다.
  • 0보다 크면 반환하고 그렇지 않으면 0을 반환합니다.

예시

#include<bits/stdc++.h>

using namespace std;
#define row 3
#define col 3

int destination_maze(int arr[row][col]) {
   if (arr[0][0] == -1) {
      return 0;
   }
   for (int i = 0; i < row; i++) {
      if (arr[i][0] == 0) {
         arr[i][0] = 1;
      } else {
         break;
      }
   }
   for (int i = 1; i < col; i++) {
      if (arr[0][i] == 0) {
         arr[0][i] = 1;
      } else {
         break;
      }
   }
   for (int i = 1; i < row; i++) {
      for (int j = 1; j < col; j++) {
         if (arr[i][j] == -1) {
            continue;
         }
         if (arr[i - 1][j] > 0) {
            arr[i][j] = (arr[i][j] + arr[i - 1][j]);
         }
         if (arr[i][j - 1] > 0) {
            arr[i][j] = (arr[i][j] + arr[i][j - 1]);
         }
      }
   }
   if (arr[row - 1][col - 1] > 0) {
      return arr[row - 1][col - 1];
   } else {
      return 0;
   }
}
int main() {
   int arr[row][col] = {
      {
         0,
         0,
         0
      },
      {
         -1,
         -1,
         0
      },
      {
         0,
         0,
         0
      }
   };
   cout << "Count of number of ways to reach destination in a Maze are: " << destination_maze(arr);
   return 0;
}

위의 코드를 실행하면 다음 출력이 생성됩니다 -

출력

Count of number of ways to reach destination in a Maze are: 1