কম্পিউটার টিউটোরিয়াল

সি++-এ বাম, ডান, নিচ ও উপরের মুভ অনুমত থাকলে ন্যূনতম খরচের পথ


মান लीजिए हमारे पास एक 2D सरणी है। जिसके प्रत्येक सेल में एक संख्या खर्च होता है जो उस सेल से होकर जाने की लागत को दर्शाता है, हमें ऊपरी-बाएं सेल से निचले-दाएं सेल तक एक ऐसा पथ ढूंढना है जिससे कुल खर्च न्यूनतम हो।

इसलिए, यदि इनपुट ऐसा है:

32101661319
1114481587
1011141751234
891264221141
100331124221

तब आउटपुट 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[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

  1. C++-এ নাইটের ন্যূনতম মুভ গণনা করুন

  2. C/C++-এ লেফট শিফট এবং রাইট শিফট অপারেটর

  3. C++ অপারেটর প্রেসিডেন্স এবং অ্যাসোসিয়েটিভিটি

  4. C++-এ অপারেটর প্রেসিডেন্স (Operators Precedence)