Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับจำนวนวิธีไปถึงจุดหมายปลายทางในเขาวงกตใน 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) ด้วยวิธีนี้เราจะได้ผลรวมที่เซลล์ (แถว-1,col-1) เป็นวิธีการเข้าถึงทั้งหมด

  • รับอาร์เรย์อินพุต arr[row][col] เป็นเขาวงกต
  • ฟังก์ชัน destination_maze(int arr[row][col]) รับ arr และส่งกลับจำนวนวิธีที่จะไปถึงปลายทางในเขาวงกต
  • หากเซลล์แรกถูกบล็อก ให้คืนค่า 0 เพื่อไปยังจุดสิ้นสุด
  • ตอนนี้สำรวจคอลัมน์ซ้ายสุดและตั้งค่า 0s ทั้งหมดเป็น 1 ในตอนแรกการอุดตันจะทำลายลูปเนื่องจากไม่สามารถเข้าถึงเซลล์ด้านล่างได้ เริ่มจากดัชนี i=0 ถึง i
  • ทำเช่นเดียวกันสำหรับแถวแรกจาก j=0 ถึง j
  • สำรวจ 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