Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में लेफ्ट, राइट, बॉटम और अप मूव्स के साथ मिनिमम कॉस्ट पाथ की अनुमति है

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

तो, अगर इनपुट पसंद है

<टीडी>10
1
<टीडी>15
8
<टीडी>11
14
<टीडी>17
5
<टीडी>12

<टीडी>12
5
<टीडी>14
1
<टीडी>11
2
<टीडी>42

32 66 13 19
11 14 48 7
10
1
34
89 42 21
10
0
33 21

तो आउटपुट 340 होगा (32 + 11 + 14 + 48 + 66 + 13 + 19 + 7 + 34 + 12 + 21 + 42 + 21) =340

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • x, y निर्देशांक और दूरी पैरामीटर के साथ सेल को परिभाषित करें।
  • आकार के सरणी मैट्रिक्स को परिभाषित करें:पंक्ति x कॉलम।
  • मैट्रिक्स को जानकारी से भरें
  • एक सरणी dx आकार परिभाषित करें:4 :={ - 1, 0, 1, 0}
  • एक सरणी डाई को आकार में परिभाषित करें:4 :={0, 1, 0, - 1}
  • सेंट नामक सेल के एक सेट को परिभाषित करें
  • सेंट में सेल(0, 0, 0) डालें
  • मैट्रिक्स[0, 0] :=ग्रिड[0, 0]
  • जबकि (सेंट खाली नहीं है), करें −
    • k :=सेंट का पहला तत्व
    • सेंट से सेंट का पहला तत्व हटाएं
    • इनिशियलाइज़ i :=0 के लिए, जब i <4, अपडेट करें (i को 1 से बढ़ाएँ), −
        करें
      • x :=k.x + dx[i]
      • y :=k.y + dy[i]
      • यदि ठीक नहीं है (x, y), तो −
        • निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
      • यदि मैट्रिक्स[x, y]> मैट्रिक्स[k.x, k.y] + ग्रिड[x, y], तो −
        • यदि मैट्रिक्स [x, y] inf के बराबर नहीं है, तो −
          • सेंट से सेल (x, y, matrix[x, y]) ढूंढें और हटाएं
        • मैट्रिक्स[x, y] :=मैट्रिक्स[k.x, k.y] + ग्रिड[x, y]
        • सेंट में सेल (x, y, मैट्रिक्स [x, y]) डालें
  • रिटर्न मैट्रिक्स[पंक्ति -1, कॉलम -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++ में न्यूनतम नाइट मूव्स

    मान लीजिए कि हमारे पास एक अनंत शतरंज की बिसात है जिसमें -infinity से +infinity तक के निर्देशांक हैं, और हमारे पास वर्ग [0, 0] पर एक नाइट है। एक शूरवीर के पास 8 संभावित चालें हैं, जैसा कि नीचे दिखाया गया है। प्रत्येक चाल एक कार्डिनल दिशा में दो वर्ग है, फिर एक वर्ग एक ओर्थोगोनल दिशा में है। हमें न

  1. सी ++ ऑपरेटर वरीयता और सहयोगीता के साथ

    संचालिका पूर्वता एक व्यंजक में पदों के समूहन को निर्धारित करती है। एक ऑपरेटर की संबद्धता एक संपत्ति है जो यह निर्धारित करती है कि एक ही वरीयता के ऑपरेटरों को कोष्ठक की अनुपस्थिति में कैसे समूहीकृत किया जाता है। यह प्रभावित करता है कि अभिव्यक्ति का मूल्यांकन कैसे किया जाता है। कुछ ऑपरेटरों की प्राथमि

  1. C++ . में ऑपरेटरों की प्राथमिकता

    संचालिका पूर्वता एक व्यंजक में पदों के समूहन को निर्धारित करती है। एक ऑपरेटर की संबद्धता एक संपत्ति है जो यह निर्धारित करती है कि एक ही वरीयता के ऑपरेटरों को कोष्ठक की अनुपस्थिति में कैसे समूहीकृत किया जाता है। यह प्रभावित करता है कि अभिव्यक्ति का मूल्यांकन कैसे किया जाता है। कुछ ऑपरेटरों की प्राथमि