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

सी ++ में मेंढक कूदो

मान लीजिए कोई मेंढक है जो नदी पार कर रहा है। नदी को x इकाइयों में विभाजित किया गया है और प्रत्येक इकाई में एक पत्थर हो सकता है। मेंढक पत्थर पर कूद सकता है, लेकिन पानी नहीं। यहां हमारे पास क्रमबद्ध आरोही क्रम क्रम में पत्थरों की स्थिति की एक सूची है, हमें यह जांचना है कि मेंढक आखिरी पत्थर पर उतरकर नदी पार करने में सक्षम है या नहीं। प्रारंभ में, मेंढक पहले पत्थर पर है और मान लें कि पहली छलांग 1 इकाई की होनी चाहिए।

जब मेंढक की वर्तमान छलांग k इकाई थी, तब उसकी अगली छलांग या तो k-1, k, या k + 1 इकाई होनी चाहिए। और मेंढक केवल आगे की दिशा में ही कूद सकता है।

तो यदि दी गई सरणी [0,1,3,4,5,7,9,10,12] की तरह है, तो उत्तर सही होगा, मेंढक 1 इकाई से दूसरे पत्थर तक, 2 इकाइयों से कूद सकता है तीसरा पत्थर, फिर 2 इकाई से चौथा पत्थर, फिर 3 इकाई से छठा पत्थर, 4 इकाई से 7वां पत्थर और अंत में 5 इकाई से 8वां पत्थर।

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

  • विज़िट किए गए मानचित्र को परिभाषित करें
  • एक फ़ंक्शन को परिभाषित करें canCross(), यह एक सरणी पत्थर लेगा, इसे 0 से प्रारंभ करें, k इसे 0 से प्रारंभ करें,
  • कुंजी :=pos OR (बाएं शिफ़्ट k 11 बिट)
  • यदि विज़िट में कुंजी मौजूद है, तो −
    • विजिट की गई वापसी[कुंजी]
  • इनिशियलाइज़ i :=pos + 1 के लिए, जब i <स्टोन्स का आकार, अपडेट करें (i से 1 तक बढ़ाएँ), करें −
    • अंतराल:=पत्थर[i] - पत्थर[स्थिति]
    • अगर गैप
    • निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
  • अगर गैप> k + 1, तो −
    • विज़िट किया [कुंजी] :=असत्य
    • झूठी वापसी
  • यदि फ़ंक्शन को कॉल करें canCross(stones, i, gap) गैर-शून्य है, तो −
    • विज़िट किया [कुंजी] =सत्य
    • सही लौटें
  • विज़िट किया गया [कुंजी] =सत्य जब (स्थिति पत्थरों के आकार के समान है - 1) अन्यथा असत्य
  • विजिट की गई वापसी[कुंजी]
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       unordered_map < lli, int > visited;
       bool canCross(vector<int>& stones, int pos = 0, int k = 0) {
          lli key = pos | k << 11;
          if(visited.find(key) != visited.end())return visited[key];
          for(int i = pos + 1; i < stones.size(); i++){
             int gap = stones[i] - stones[pos];
             if(gap < k - 1)continue;
             if(gap > k + 1){
                return visited[key] = false;
             }
             if(canCross(stones, i, gap))return visited[key] = true;
          }
          return visited[key] = (pos == stones.size() - 1);
       }
    };
    main(){
       Solution ob;
       vector<int> v = {0,1,3,5,6,8,12,17};
       cout << (ob.canCross(v));
    }

    इनपुट

    0,1,3,5,6,8,12,17

    आउटपुट

    1

    1. C++ में T सेकंड के बाद मेंढक की स्थिति

      मान लीजिए कि हमारे पास एक अप्रत्यक्ष वृक्ष है जिसमें n शीर्ष हैं। शीर्षों की संख्या 1 से n तक है। अब एक मेंढक शीर्ष 1 से कूदना शुरू करता है। मेंढक एक सेकंड में अपने वर्तमान शीर्ष से दूसरे गैर-विजिट किए गए शीर्ष पर कूद सकता है यदि वे आसन्न हैं। मेंढक वापस देखे गए शीर्ष पर नहीं जा सकता। यदि मेंढक कई श

    1. सी++ में जंप गेम IV

      मान लीजिए कि हमारे पास arr नामक पूर्णांकों की एक सरणी है। हम शुरुआत में इंडेक्स 0 पर हैं। एक चरण में हम इंडेक्स i से i + x पर जा सकते हैं जहां:i + x =0. j जहां:arr[i] और arr[j] समान हैं और i और j समान नहीं हैं। यहाँ n सरणी का आकार है। सरणी के अंतिम सूचकांक तक पहुंचने के लिए हमें न्यूनतम चरणों की संख

    1. सी++ में जंप गेम वी

      मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है जिसे arr और एक पूर्णांक d कहा जाता है। एक चरण में हम इंडेक्स i से − . पर जा सकते हैं i + x जहां:i + x