使用 C++ 統計迷宮中到達目的地的路徑數


給定一個表示為行 X 列矩陣的迷宮,其中障礙物表示為 -1,而空單元格的值不為 -1。目標是從第一個單元格 arr[0][0] 到達最後一個單元格 arr[row][col],並且只允許兩種移動方式

  • 向右移動:從 arr[i][j] 到 arr[i][j+1] 以及
  • 向下移動:從 arr[i][j] 到 arr[i+1][j]。

讓我們透過示例來理解。

輸入 - arr[row][col] = {{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[row][col] = { {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) 

下面程式中使用的方案如下

在這種方案中,我們首先將所有零設定為 1。再次遍歷迷宮矩陣,現在對於每個單元格,如果它是障礙物(-1),則忽略它。如果不是,則檢查上面的單元格(i-1,j)和左邊的單元格(i,j-1)。如果它大於零,則將其值新增到當前單元格(i,j)。這樣,我們將得到單元格 (row-1,col-1) 處的總和作為到達它的總路徑數。

  • 將輸入陣列 arr[row][col] 作為迷宮。
  • 函式 destination_maze(int arr[row][col]) 獲取 arr 並返回迷宮中到達目的地的路徑數。
  • 如果第一個單元格被阻塞,則返回 0 作為到達終點的路徑數。
  • 現在遍歷最左邊的列並將所有 0 設定為 1。首先,障礙物會中斷迴圈,因為其下面的單元格無法到達。從索引 i=0 到 i<row 開始,如果 arr[i][0] 為 0,則將其設定為 1。
  • 同樣,對第一行從 j=0 到 j<col 執行相同的操作,如果 arr[j][0] 為 0,則將其設定為 1。
  • 再次遍歷 arr 從單元格 (1,1) 開始,如果 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

更新於: 2021年1月29日

446 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告