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

C++ में रेस कार (Race Car) समस्या


मान लीजिए हमारे पास एक कार है, जो अनंत संख्या रेखा पर स्थिति 0 और गति +1 से शुरू होती है। कार निर्देशों के एक क्रम के अनुसार स्वचालित रूप से चलती है: A - त्वरण (accelerate) के लिए और R - रिवर्स (reverse) के लिए। जब हमें निर्देश "A" मिलता है, तो हमारी कार निम्न करती है -

  • स्थिति := स्थिति + गति, फिर गति = गति * 2।

जब हमें निर्देश "R" मिलता है, तो हमारी कार निम्न करती है -

  • यदि गति धनात्मक है तो गति = -1,
  • अन्यथा गति = 1।

उदाहरण के लिए, निर्देश "AAR" निष्पादित करने के बाद, हमारी कार स्थितियों 0->1->3->3 पर जाती है, और गति 1->2->4->-1 हो जाती है।

अब मान लीजिए हमारे पास कोई लक्ष्य स्थिति है; हमें वहां पहुंचने के लिए निर्देशों के सबसे छोटे अनुक्रम की लंबाई ज्ञात करनी है।

तो, यदि इनपुट target = 6 जैसा है, तो आउटपुट 5 होगा क्योंकि संभावित अनुक्रमों में से एक AAARA है, स्थिति अनुक्रम 0->1->3->7->7->6 होगा।

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

  • एक सेट visited परिभाषित करें
  • एक क्यू q परिभाषित करें
  • { 0, 1 } को q में डालें
  • level := 0 से प्रारंभ करें, जब q खाली नहीं है, level बढ़ाते हुए, करें -
    • k := q के आकार से प्रारंभ करें, जब k > 0, k घटाते हुए, करें -
      • curr := q के सामने का तत्व, q से तत्व हटाएं
      • यदि curr का पहला भाग target के समान है, तो -
        • level वापस करें
      • forward := curr का पहला भाग + curr का दूसरा भाग
      • forwardSpeed := curr का दूसरा भाग * 2
      • key := forward को स्ट्रिंग में बदलें + " * " + forwardSpeed को स्ट्रिंग में बदलें
      • यदि forward > 0 और |forward - target| < target और key visited में नहीं है, तो -
        • key को visited में डालें
        • { forward, forwardSpeed } को q में डालें
      • key := curr के पहले भाग को स्ट्रिंग में बदलें + " * " + (curr का दूसरा भाग > 0 ? -1 : 1)
      • यदि curr.first > 0 और |target - curr.first| < target और key visited में नहीं है, तो -
        • key को visited में डालें
        • { curr.first, (यदि curr.second > 0, तो -1, अन्यथा 1) } को q में डालें
  • -1 वापस करें

बेहतर समझ के लिए निम्न कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h> using namespace std; class Solution { public:    int racecar(int target) {       unordered_set < string > visited;       queue < pair <int ,int> > q;       q. push({0, 1});       for(int level = 0; !q.empty(); level++){          for(int k = q.size(); k > 0; k-- ){             pair <int, int> curr = q.front();             q.pop();             if(curr.first == target) return level;             int forward = curr.first + curr.second;             int forwardSpeed = curr.second * 2;             string key = to_string(forward) + "*" + to_string(forwardSpeed);             if(forward > 0 && abs(forward - target) < target && !visited.count(key)){                visited.insert(key);                q.push({forward, forwardSpeed});             }             key = to_string(curr.first) + "*" + to_string(curr.second > 0 ? - 1: 1);             if(curr.first > 0 && abs(target - curr.first) < target && !visited.count(key)){                visited.insert(key);                q.push({curr.first, curr.second > 0 ? - 1: 1});             }          }       }       return -1;    } }; main(){    Solution ob;    cout << (ob.racecar(6)); }

इनपुट

6

आउटपुट

5

  1. - C++ में static_assert

    static_assert एक फंक्शन है जो प्रोग्रामर्स के लिए प्रोग्राम को कंपाइल करने के बाद आउटपुट को ज्यादा गड़बड़ किए बिना स्क्रीन पर त्रुटि प्रिंट करने के लिए उपयोगी है। पहले C++11 और C++14 में, static_assert की अलग कार्यक्षमता थी जिसका अर्थ है कि हमें static_assert को परिभाषित करते समय अपना संदेश लिखना प

  1. - पासिंग कार जोड़ों की गणना - C++

    समस्या विवरण हमें 0 और 1 वाली एक सरणी दी गई है। 1 = पश्चिम की ओर जाती कार, 0 = पूर्व की ओर जाती कार। पासिंग कार जोड़ा: (0,1) जहाँ 0 का इंडेक्स 1 के इंडेक्स से कम हो। उदाहरण इनपुट: arr[] = {1,0,1,0,1} आउटपुट: 3 व्याख्या: जोड़े: (arr[1],arr[2]), (arr[1],arr[4]), (arr[3],arr[4]) इनपुट: arr[] = {1,0,0

  1. C++ में सबसे बड़ा BST सबट्री - अधिकतम नोड्स वाला BST खोजें C++ में सबसे बड़ा BST सबट्री - अधिकतम नोड्स वाला BST खोजें

    समस्या विवरण मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें उसका सबसे बड़ा सबट्री ढूंढना है जहां सबसे बड़ा का अर्थ है सबसे अधिक नोड्स वाला सबट्री। उदाहरण के लिए, यदि इनपुट इस तरह का ट्री है: तो आउटपुट 3 होगा, क्योंकि इस मामले में सबसे बड़ा BST सबट्री हाइलाइट किया गया है। समाधान दृष्टिकोण पोस्ट-ऑर्ड