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

C++ में फ्लिप गेम II - शुरुआती खिलाड़ी की जीत की गारंटी जांचें


समस्या विवरण

मान लीजिए दो खिलाड़ी फ्लिप गेम खेल रहे हैं। यहां हमारे पास एक स्ट्रिंग है जिसमें केवल ये दो वर्ण होते हैं: + और -। खिलाड़ी 1 और खिलाड़ी 2 बारी-बारी से दो लगातार "++" को "--" में फ्लिप करते हैं। खेल तब समाप्त होता है जब एक खिलाड़ी कोई चाल नहीं चल सकता और इसलिए दूसरा विजेता होगा। हमें एक फ़ंक्शन परिभाषित करना है जो जांचे कि क्या शुरुआती खिलाड़ी जीत की गारंटी दे सकता है।

उदाहरण के लिए, यदि इनपुट s = "++++" है, तो आउटपुट true होगा, क्योंकि शुरुआती खिलाड़ी बीच के "++" को फ्लिप करके "+--+" बनाकर जीत की गारंटी दे सकता है।

समाधान दृष्टिकोण

मेमोइजेशन के साथ DFS (मिनिमैक्स):

  1. एक मैप memo परिभाषित करें
  2. solve() फ़ंक्शन परिभाषित करें जो s लेता है:
    • यदि s memo में है, तो memo[s] लौटाएं
    • possible := false
    • n := s का आकार
    • i को 0 से n-2 तक लूप करें:
      • यदि s[i] == '+' और s[i+1] == '+':
        • s[i] := '-', s[i+1] := '-'
        • possible := possible OR NOT solve(s)
        • s[i] := '+', s[i+1] := '+' (बैकट्रैक)
        • यदि possible सत्य है, तो memo[s] := possible लौटाएं
    • memo[s] := possible लौटाएं
  3. मुख्य विधि से: solve(s) लौटाएं

C++ कार्यान्वयन

#include <bits/stdc++.h> 
using namespace std; 

class Solution { 
public: 
    unordered_map <string, bool> memo; 
    
    bool solve(string s){ 
        if (memo.count(s)) 
            return memo[s]; 
        bool possible = false; 
        int n = s.size(); 
        for (int i = 0; i < n - 1; i++) { 
            if (s[i] == '+' && s[i + 1] == '+') { 
                s[i] = '-'; 
                s[i + 1] = '-'; 
                possible |= !solve(s); 
                s[i] = '+'; 
                s[i + 1] = '+'; 
                if (possible) 
                    return memo[s] = possible; 
            } 
        } 
        return memo[s] = possible; 
    } 
    
    bool canWin(string s) { 
        return solve(s); 
    } 
}; 

int main(){ 
    Solution ob; 
    cout << (ob.canWin("++++")); 
    return 0;
}

इनपुट

"++++"

आउटपुट

1
  1. C++ में जंप गेम IV C++ में जंप गेम IV

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

  1. C++ में जंप गेम V C++ में जंप गेम V

    मान लीजिए हमारे पास arr नामक पूर्णांकों की एक सरणी और एक पूर्णांक d है। एक चरण में हम इंडेक्स i से कूद सकते हैं: i + x जहां: i + x < n और x की सीमा 1 से d है। = 0 और x की सीमा 1 से d है। arr[k] हो। हम सरणी के किसी भी इंडेक्स से कूदना शुरू कर सकते हैं। हमें अधिकतम इंडेक्स की संख्या ज्ञात करनी है ज

  1. - C++ STL में bitset::flip() फंक्शन

    bitset::flip() फंक्शन क्या है? bitset::flip() C++ STL (स्टैंडर्ड टेम्पलेट लाइब्रेरी) का एक इनबिल्ट मेथड है। यह कॉलिंग बिटसेट के बिट्स को फ्लिप करता है। जब कोई पैरामीटर पास नहीं किया जाता तो यह मेथड सभी 0 को 1 में और सभी 1 को 0 में बदल देता है, यानी कॉलिंग बिटसेट के प्रत्येक बिट को उलट देता है। यदि