মান लीजिए हमारे पास एक 2D सरणी है। जिसके प्रत्येक सेल में एक संख्या खर्च होता है जो उस सेल से होकर जाने की लागत को दर्शाता है, हमें ऊपरी-बाएं सेल से निचले-दाएं सेल तक एक ऐसा पथ ढूंढना है जिससे कुल खर्च न्यूनतम हो।
इसलिए, यदि इनपुट ऐसा है:
| 32 | 101 | 66 | 13 | 19 |
| 11 | 14 | 48 | 158 | 7 |
| 101 | 114 | 175 | 12 | 34 |
| 89 | 126 | 42 | 21 | 141 |
| 100 | 33 | 112 | 42 | 21 |
तब आउटपुट 340 होगा जैसे (32 + 11 + 14 + 48 + 66 + 13 + 19 + 7 + 34 + 12 + 21 + 42 + 21) = 340
समाधान दृष्टिकोण
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- x, y कोऑर्डिनेट और डिस्टेंस पैरामीटर के साथ एक सेल परिभाषित करें।
- आकार: रो x कॉलम का एक मैट्रिक्स सरणी परिभाषित करें।
- मैट्रिक्स को अनंत (inf) से भरें।
- आकार 4 का एक dx सरणी परिभाषित करें := {-1, 0, 1, 0}
- आकार 4 का एक dy सरणी परिभाषित करें := {0, 1, 0, -1}
- सेल का एक सेट st परिभाषित करें
- सेल(0, 0, 0) को st में डालें
- matrix[0, 0] := grid[0, 0]
- जब तक (st खाली नहीं है), करें:
- k := st का पहला तत्व
- st से st का पहला तत्व हटाएं
- i := 0 से आरंभ करें, जब i < 4, अपडेट करें (i को 1 से बढ़ाएं), करें:
- x := k.x + dx[i]
- y := k.y + dy[i]
- यदि isOk(x, y) नहीं है, तो अगले इटरेशन पर जाएं
- यदि matrix[x, y] > matrix[k.x, k.y] + grid[x, y], तो:
- यदि matrix[x, y] inf के बराबर नहीं है, तो:
- st से सेल(x, y, matrix[x, y]) ढूंढें और हटाएं
- matrix[x, y] := matrix[k.x, k.y] + grid[x, y]
- सेल(x, y, matrix[x, y]) को st में डालें
- यदि matrix[x, y] inf के बराबर नहीं है, तो:
- matrix[row - 1, col - 1] लौटाएं
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
#include <bits/stdc++.h> using namespace std; #define ROW 5 #define COL 5 class cell { public: int x, y; int distance; cell(int x, int y, int distance) : x(x), y(y), distance(distance) {} }; bool operator<(const cell& a, const cell& b) { if (a.distance == b.distance) { if (a.x != b.x) return (a.x < b.x); else return (a.y < b.y); } return (a.distance < b.distance); } bool isOk(int i, int j) { return (i >= 0 && i < COL && j >= 0 && j < ROW); } int solve(int grid[ROW][COL], int row, int col) { int matrix[row][col]; for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) matrix[i][j] = INT_MAX; int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; set<cell> st; st.insert(cell(0, 0, 0)); matrix[0][0] = grid[0][0]; while (!st.empty()) { cell k = *st.begin(); st.erase(st.begin()); for (int i = 0; i < 4; i++) { int x = k.x + dx[i]; int y = k.y + dy[i]; if (!isOk(x, y)) continue; if (matrix[x][y] > matrix[k.x][k.y] + grid[x][y]){ if (matrix[x][y] != INT_MAX) st.erase(st.find(cell(x, y, matrix[x][y]))); matrix[x][y] = matrix[k.x][k.y] + grid[x][y]; st.insert(cell(x, y, matrix[x][y])); } } } return matrix[row - 1][col - 1]; } int main() { int grid[ROW][COL] = { 32, 101, 66, 13, 19, 11, 14, 48, 158, 7, 101, 114, 175, 12, 34, 89, 126, 42, 21, 141, 100, 33, 112, 42, 21 }; cout << solve(grid, ROW, COL); }
इनपुट
{32, 101, 66, 13, 19, 11, 14, 48, 158, 7, 101, 114, 175, 12, 34, 89, 126, 42, 21, 141, 100, 33, 112, 42, 21 };
आउटपुट:
340