กำหนดเขาวงกตที่แสดงเป็นเมทริกซ์แถว 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
- ทำเช่นเดียวกันสำหรับแถวแรกจาก j=0 ถึง j
ตัวอย่าง
#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