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

सी ++ में सभी कुंजी प्राप्त करने का सबसे छोटा रास्ता


मान लीजिए कि हमारे पास एक ग्रिड है। कुछ प्रतीक हैं। "।" खाली सेल का संकेत दे रहा है, "#" दीवार के लिए है, "@" शुरुआती बिंदु के लिए है, ("ए", "बी", ...) सभी कुंजियां हैं, और ("ए", "बी", ... ) सभी ताले हैं। हम शुरुआती बिंदु से शुरू करेंगे, और एक चाल में 4 दिशाओं (बाएं, दाएं, ऊपर, नीचे) में से एक में एक स्थान चलना शामिल है। हम ग्रिड से बाहर नहीं जाएंगे, और हमारे रास्ते को अवरुद्ध करने के लिए दीवारें हैं। यदि हम किसी चाबी के ऊपर से चलते हैं, तो हम उसे उठा लेते हैं। जब तक हमारे पास संबंधित कुंजी न हो, हम ताले के ऊपर से नहीं चल सकते।

ए, बी आदि जैसे प्रत्येक लॉक के लिए हमारे पास ए, बी, आदि जैसी चाबियां होती हैं, इसलिए लॉक अपरकेस अक्षरों में एक ही अक्षर होते हैं और चाबियां लोअर केस अक्षरों के साथ समान होती हैं।

हमें सभी कुंजियों को प्राप्त करने के लिए सबसे कम संख्या में चालों को खोजना होगा। अगर यह असंभव है, तो -1 लौटें।

इसलिए, यदि इनपुट ["@.a.#",,"###.#",,"b.A.B"] जैसा है, तो आउटपुट 8

होगा

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

  • n :=पंक्तियों की संख्या, m :=स्तंभों की संख्या

  • आकार 3 की एक सरणी प्रारंभ परिभाषित करें

  • सीएनटी:=0

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • इनिशियलाइज़ j :=0 के लिए, जब j

      • अगर ग्रिड [i, j] '@' के समान है, तो -

        • प्रारंभ [1]:=मैं, प्रारंभ [2]:=जे

      • अगर ग्रिड[i, j]>='a' और ग्रिड[i, j] <='f', तो -

        • cnt :=अधिकतम cnt और ग्रिड[i, j] - 'a' + 1

  • देखे गए एक सेट को परिभाषित करें

  • अनुरोध :=2^(cnt - 1)

  • सरणियों की एक कतार q परिभाषित करें

  • q में प्रारंभ डालें

  • विज़िट में प्रारंभ डालें

  • स्तर:=0

  • जबकि (नहीं q खाली है), करें -

    • sz :=q का आकार

    • जबकि sz गैर-शून्य है, प्रत्येक पुनरावृत्ति के बाद sz घटाएं, −

      . करें
      • एक सरणी को परिभाषित करें curr :=q का अगला तत्व

      • q से तत्व हटाएं

      • कुंजी:=वर्तमान [0]

      • यदि कुंजी req के समान है, तो -

        • वापसी स्तर

      • x :=curr[1], y :=curr[2]

      • prevKey :=key

      • इनिशियलाइज़ करने के लिए मैं :=0, जब मैं <4, अपडेट (i 1 से बढ़ाएँ), करें -

        • एनएक्स:=एक्स + डीआईआर [i, 0], एनवाई:=वाई + डीआईआर [i, 1]

        • कुंजी :=पिछलाकुंजी

        • अगर nx>=0 और ny>=0 और nx

          • अगर ग्रिड [एनएक्स, एनवाई] '#' के समान है, तो -

            • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

          • अगर ग्रिड [एनएक्स, एनवाई]>='ए' और ग्रिड [एनएक्स, एनवाई] <='एफ', तो -

            • key :=key OR (2^(grid[nx, ny] - ASCII of 'a'))

          • अगर ग्रिड [एनएक्स, एनवाई]>='ए' और ग्रिड [एनएक्स, एनवाई] <='एफ', तो -

            • अगर (दाईं ओर शिफ्ट कुंजी (ग्रिड [एनएक्स, एनवाई] - 'ए' का एएससीआईआई) टाइम्स और 1 0 के समान है, तो -

              • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

          • एक सरणी स्थिति परिभाषित करें ({कुंजी, nx, ny})

          • यदि राज्य का दौरा किया गया है, तो -

            • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

          • q में राज्य डालें

          • विज़िट में राज्य डालें

    • (स्तर 1 से बढ़ाएँ)

  • वापसी -1

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
class Solution {
   public:
   int shortestPathAllKeys(vector<string>& grid) {
      int n = grid.size();
      int m = grid[0].size();
      vector<int> start(3);
      int cnt = 0;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            if (grid[i][j] == '@') {
               start[1] = i;
               start[2] = j;
            }
            if (grid[i][j] >= 'a' && grid[i][j] <= 'f') {
               cnt = max(cnt, grid[i][j] - 'a' + 1);
            }
         }
      }
      set<vector<int> > visited;
      int req = (1 << cnt) - 1;
      queue<vector<int> > q;
      q.push(start);
      visited.insert(start);
      int level = 0;
      while (!q.empty()) {
         int sz = q.size();
         while (sz--) {
            vector<int> curr = q.front();
            q.pop();
            int key = curr[0];
            if (key == req)
            return level;
            int x = curr[1];
            int y = curr[2];
            int nx, ny;
            int prevKey = key;
            for (int i = 0; i < 4; i++) {
               nx = x + dir[i][0];
               ny = y + dir[i][1];
               key = prevKey;
               if (nx >= 0 && ny >= 0 && nx < n && ny < m) {
                  if (grid[nx][ny] == '#')
                  continue;
                  if (grid[nx][ny] >= 'a' && grid[nx][ny] <=
                  'f') {
                     key |= (1 << (grid[nx][ny] - 'a'));
                  }
                  if (grid[nx][ny] >= 'A' && grid[nx][ny] <=
                  'F') {
                     if (((key >> (grid[nx][ny] - 'A')) & 1)
                     == 0)
                     continue;
                  }
                  vector<int> state({ key, nx, ny });
                  if (visited.count(state))
                  continue;
                  q.push(state);
                  visited.insert(state);
               }
            }
         }
         level++;
      }
      return -1;
   }
};
main(){
   Solution ob;
   vector<string> v = {"@.a.#","###.#","b.A.B"};
   cout << (ob.shortestPathAllKeys(v));
}

इनपुट

{"@.a.#","###.#","b.A.B"}

आउटपुट

8

  1. C++ में बाइनरी ट्री में सभी k-योग पथ प्रिंट करें

    इस समस्या में, हमें एक बाइनरी ट्री और एक नंबर K दिया जाता है और हमें ट्री में सभी पथ प्रिंट करने होते हैं जिनमें पथ में नोड्स का योग k के बराबर होता है। यहां, पेड़ का पथ पेड़ के किसी भी नोड से शुरू हो सकता है और किसी भी नोड पर समाप्त हो सकता है। पथ हमेशा रूट नोड से लीफ नोड तक निर्देशित होना चाहिए।

  1. MongoDB संग्रह में सभी नाम प्राप्त करें

    मूल रूप से 18 जनवरी, 2019 को ObjectRocket.com/blog पर प्रकाशित हुआ। अपने स्कीमा को सत्यापित करने के लिए, फ़ील्ड में टाइपो के लिए डीबग करें, या ऐसे फ़ील्ड ढूंढें जिन्हें आपको सेट नहीं करना चाहिए, आपको अपने MongoDB® संग्रह में सभी कुंजियों की समझ की आवश्यकता है। ObjectRocket सहित कई MongoDB-as-a-S

  1. MongoDB संग्रह में सभी कुंजियों के नाम प्राप्त करें

    अपने स्कीमा को सत्यापित करने के लिए, फ़ील्ड में टाइपो के लिए डीबग करें, या ऐसे फ़ील्ड ढूंढें जिन्हें सेट नहीं किया जाना चाहिए, आपको अपने MongoDB संग्रह में सभी कुंजियों की समझ प्राप्त करने की आवश्यकता होगी। कई MongoDB-as-a-service कंपनियाँ UI में इस अधिकार को करने का एक आसान तरीका प्रदान करती हैं,