मान लीजिए कि हमारे पास एक कार है, जो स्थिति 0 से शुरू होती है और एक अनंत संख्या रेखा पर गति +1 करती है। कार स्वचालित रूप से निर्देश ए के अनुक्रम के अनुसार चलती है:गति के लिए और आर - रिवर्स के लिए। जब हमें निर्देश "ए" मिलता है, तो हमारी कार निम्नलिखित कार्य करती है -
- स्थिति:=स्थिति + गति, फिर गति =गति * 2.
जब हमें निर्देश "R" मिलता है, तो हमारी कार निम्न कार्य करती है -
- यदि गति धनात्मक है तो गति =-1,
- अन्यथा गति =1.
उदाहरण के लिए, "एएआर" निर्देशों को निष्पादित करने के बाद, हमारी कार 0->1->3->3 की स्थिति में जाती है, और गति 1->2->4->-1 हो जाती है।
अब मान लीजिए कि हमारे पास कुछ लक्ष्य स्थिति है; हमें वहां पहुंचने के लिए निर्देशों के सबसे छोटे अनुक्रम की लंबाई का पता लगाना होगा।
इसलिए, यदि इनपुट लक्ष्य =6 जैसा है, तो आउटपुट 5 होगा क्योंकि संभावित अनुक्रमों में से एक AAARA है, स्थिति अनुक्रम 0->1->3->7->7->6
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- देखे गए एक सेट को परिभाषित करें
- एक कतार q परिभाषित करें
- क्यू में { 0, 1 } डालें
- इनिशियलाइज़ लेवल के लिए:=0, जब q खाली न हो, तो अपडेट करें (1 से लेवल बढ़ाएँ), −
- करें
- इनिशियलाइज़ k :=q के आकार के लिए, जब k> 0, अपडेट करें (k को 1 से घटाएँ), करें -
- एक जोड़ी वक्र परिभाषित करें:=q का अगला तत्व, q से तत्व हटाएं
- यदि पहला curr लक्ष्य के समान है, तो −
- वापसी स्तर
- आगे :=कर्व का पहला + कर्व का दूसरा
- फॉरवर्डस्पीड :=दूसरा करंट * 2
- कुंजी :=स्ट्रिंग में आगे कनवर्ट करें concatenate "*" concatenate फॉरवर्डस्पीड को स्ट्रिंग में कनवर्ट करें
- अगर आगे> 0 और |आगे - लक्ष्य| <लक्ष्य और कुंजी नहीं देखी गई है, तो −
- भेजे गए में कुंजी डालें
- क्यू में {फॉरवर्ड, फॉरवर्डस्पीड} डालें
- कुंजी :=पहले curr को स्ट्रिंग में बदलें "*" concatenate 0 जब curr का दूसरा> 0, अन्यथा -1
- अगर curr.first> 0 और |target - curr.first| <लक्ष्य और कुंजी का दौरा नहीं किया गया है, तो −
- भेजे गए में कुंजी डालें q में
- सम्मिलित करें { curr.first, (यदि curr.second> 0, फिर -1, अन्यथा 1 })
- इनिशियलाइज़ k :=q के आकार के लिए, जब k> 0, अपडेट करें (k को 1 से घटाएँ), करें -
- वापसी -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