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

सी ++ में दिए गए बाधाओं के साथ मैट्रिक्स में सबसे लंबा पथ खोजें

मान लीजिए कि हमारे पास ऑर्डर n का एक वर्ग मैट्रिक्स है। इसमें सभी विशिष्ट तत्व हैं। इसलिए हमें अधिकतम लंबाई पथ ज्ञात करना है, जैसे कि पथ के साथ सभी कोशिकाएं 1 के अंतर के साथ बढ़ते क्रम में हैं। एक सेल से हम चार दिशाओं में जा सकते हैं। बाएँ, दाएँ, ऊपर और नीचे। तो अगर मैट्रिक्स की तरह है -

1 2 9
5 3 8
4 6 7

तो आउटपुट 4 होगा। चूंकि सबसे लंबा रास्ता 6→7→8→ 9

. है

इस समस्या को हल करने के लिए, हम इस विचार का पालन करेंगे। हम प्रत्येक सेल से शुरू होने वाले सबसे लंबे पथ की गणना करेंगे। एक बार जब हमें सभी सेल के लिए सबसे लंबा रास्ता मिल जाता है, तो हम अधिकतम सभी सबसे लंबे पथ लौटाते हैं।

इस दृष्टिकोण में एक महत्वपूर्ण अवलोकन कई अतिव्यापी उप-समस्याएं हैं। इसलिए डायनेमिक प्रोग्रामिंग का उपयोग करके इस समस्या को हल किया जा सकता है। यहां हम एक लुकअप टेबल dp[][] का उपयोग यह जांचने के लिए करेंगे कि कोई समस्या पहले ही हल हो चुकी है या नहीं।

उदाहरण

#include <iostream>
#define n 3
using namespace std;
int getLongestPathLengthUtil(int i, int j, int matrix[n][n], int table[n][n]) {
   if (i < 0 || i >= n || j < 0 || j >= n)
   return 0;
   if (table[i][j] != -1)
      return table[i][j];
   int x = INT_MIN, y = INT_MIN, z = INT_MIN, w = INT_MIN;
   if (j < n - 1 && ((matrix[i][j] + 1) == matrix[i][j + 1]))
      x = 1 + getLongestPathLengthUtil(i, j + 1, matrix, table);
   if (j > 0 && (matrix[i][j] + 1 == matrix[i][j - 1]))
      y = 1 + getLongestPathLengthUtil(i, j - 1, matrix, table);
   if (i > 0 && (matrix[i][j] + 1 == matrix[i - 1][j]))
      z = 1 + getLongestPathLengthUtil(i - 1, j, matrix, table);
   if (i < n - 1 && (matrix[i][j] + 1 == matrix[i + 1][j]))
      w = 1 + getLongestPathLengthUtil(i + 1, j, matrix, table);
      return table[i][j] = max(x, max(y, max(z, max(w, 1))));
}
int getLongestPathLength(int matrix[n][n]) {
   int result = 1;
   int table[n][n];
   for(int i = 0; i < n; i++)
   for(int j = 0; j < n; j++)
   table[i][j] = -1;
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
         if (table[i][j] == -1)
         getLongestPathLengthUtil(i, j, matrix, table);
         result = max(result, table[i][j]);
      }
   }
   return result;
}
int main() {
   int mat[n][n] = { { 1, 2, 9 },
   { 5, 3, 8 },
   { 4, 6, 7 } };
   cout << "Length of the longest path is "<< getLongestPathLength(mat);
}

आउटपुट

Length of the longest path is 4

  1. C++ में दिए गए आरंभिक वर्णों में से सबसे लंबे क्रमागत पथ की लंबाई ज्ञात कीजिए

    विभिन्न वर्णों का एक मैट्रिक्स दिया गया है। एक चरित्र से शुरू करते हुए हमें उन सभी पात्रों को पार करके सबसे लंबा रास्ता खोजना होगा जो वर्तमान चरित्र से बड़े हैं। वर्ण एक दूसरे के क्रमागत होते हैं। ई से शुरू होता है। सबसे लंबा रास्ता खोजने के लिए, हम डेप्थ फर्स्ट सर्च एल्गोरिथम का उपयोग करेंगे। D

  1. C++ में दिए गए सूचकांकों के साथ N फाइबोनैचि संख्याओं की GCD ज्ञात कीजिए

    यहाँ हमें दिए गए सूचकांकों के साथ n फाइबोनैचि पदों की GCD ज्ञात करनी है। तो सबसे पहले हमें अधिकतम सूचकांक प्राप्त करना होगा, और फाइबोनैचि शब्द उत्पन्न करना होगा, कुछ फाइबोनैचि शब्द इस प्रकार हैं:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ….. सूचकांक शुरू होता है 0 से। तो तत्व 0th . पर सूचकांक 0 है। यदि हमें स

  1. सी ++ प्रोग्राम किसी दिए गए अनुक्रम के सबसे लंबे समय तक बढ़ते क्रम को खोजने के लिए

    सबसे लंबे समय तक बढ़ने वाला क्रम वह क्रम है जहां एक आइटम अपने पिछले आइटम से बड़ा होता है। यहां हम पूर्णांकों के एक सेट से सबसे लंबी बढ़ती अनुवर्ती लंबाई खोजने का प्रयास करेंगे। Input: A set of integers. {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} Output: The length of longest increasing