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

C++ . में दीवारें और गेट

मान लीजिए कि हमारे पास एक m x n 2D ग्रिड है, और यह इन तीन संभावित मानों के साथ आरंभ किया गया है।

  • -1 दीवार या बाधा के लिए।

  • 0 गेट के लिए।

  • INF यह अनंत का अर्थ है एक खाली कमरा।

यहाँ 2^31 - 1 =2147483647 INF है क्योंकि हम मान सकते हैं कि एक गेट की दूरी 2147483647 से कम है। प्रत्येक खाली कमरे को उसके निकटतम गेट की दूरी से भरें। अगर किसी गेट तक पहुंचना नामुमकिन है, तो उसे आईएनएफ से भरा जाना चाहिए।

तो, अगर इनपुट पसंद है

INF -1 0 आईएनएफ
INF आईएनएफ आईएनएफ -1
INF -1 आईएनएफ -1
0 -1 आईएनएफ आईएनएफ

तो आउटपुट होगा

3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4

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

  • आकार की एक सरणी dir परिभाषित करें:4 x 2 :={{1, 0}, {-1, 0}, {0, 1}, {0,-1}}

  • n :=कमरों का आकार

  • m :=(यदि n गैर-शून्य है, तो स्तंभ गणना, अन्यथा 0)

  • जोड़े की एक कतार q परिभाषित करें

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

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

      • अगर कमरे [i, j] 0 के समान है, तो -

        • q में { i, j } डालें

  • lvl को इनिशियलाइज़ करने के लिए:=1, जब q खाली न हो, तो अपडेट करें (lvl को 1 से बढ़ाएँ), करें -

    • sz :=q का आकार

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

      • एक जोड़ी वक्र परिभाषित करें :=q का पहला तत्व

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

      • x :=curr.first

      • y :=curr.second

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

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

        • ny :=y + dir[i, 1]

        • यदि nx <0 या ny <0 या nx>=n या ny>=m या कमरे[nx, ny]

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

        • कमरे [एनएक्स, एनवाई]:=एलवीएल

        • q में { nx, ny } डालें

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto< > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
class Solution {
public:
   void wallsAndGates(vector<vector<int<>& rooms) {
      int n = rooms.size();
      int m = n ? rooms[0].size() : 0;
      queue<pair<int, int> > q;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            if (rooms[i][j] == 0)
               q.push({ i, j });
         }
      }
      for (int lvl = 1; !q.empty(); lvl++) {
         int sz = q.size();
         while (sz--) {
            pair<int, int> curr = q.front();
            q.pop();
            int x = curr.first;
            int y = curr.second;
            for (int i = 0; i < 4; i++) {
               int nx = x + dir[i][0];
               int ny = y + dir[i][1];
               if (nx < 0 || ny < 0 || nx >= n || ny >= m || rooms[nx][ny] < lvl)
                  continue;
               rooms[nx][ny] = lvl;
               q.push({ nx, ny });
            }
         }
      }
   }
};
main(){
   vector<vector<int<> v = {{2147483647,-1,0,2147483647}, {2147483647,2147483647,2147483647,-1}, {2147483647,-1,2147483647,-1}, {0,-1,2147483647,2147483647}};
   Solution ob;
   ob.wallsAndGates(v);
   print_vector(v);
}

इनपुट

{{2147483647,-1,0,2147483647},{2147483647,2147483647,2147483647,-1}, {2147483647,-1,2147483647,-1},{0,-1,2147483647,2147483647}}

आउटपुट

[[3, -1, 0, 1, ],[2, 2, 1, -1, ],[1, -1, 2, -1, ],[0, -1, 3, 4, ],]

  1. सम सूचकांक पर सम संख्याएँ और C++ में विषम सूचकांक पर विषम संख्याएँ

    इस समस्या में, हमें n / 2 सम मानों और n / 2 विषम मानों से मिलकर n आकार का एक arr [] दिया जाता है। हमारा कार्य सम सूचकांक पर सम संख्याओं और विषम संख्याओं को विषम सूचकांक पर रखने के लिए एक प्रोग्राम बनाना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट: गिरफ्तारी [] ={5, 1, 6, 4, 3, 8} आउटपुट

  1. C++ में वृत्त और आयत ओवरलैपिंग

    मान लीजिए कि हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) के रूप में दर्शाया गया है, यहाँ (xc, yc) वृत्त का केंद्र निर्देशांक है। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) के रूप में दर्शाया गया है, जहाँ (x1, y1) निचले-बाएँ कोने के निर्देशांक हैं, और (x2, y2) शीर्ष-दाएँ के निर्देशां

  1. डोमिनोज़ और ट्रोमिनो टाइलिंग सी++ . में

    मान लीजिए कि हमारे पास दो प्रकार की आकृतियाँ हैं, डोमिनोज़ और ट्रोमिनो। उन्हें नीचे की तरह घुमाया जा सकता है - एक टाइलिंग में, प्रत्येक वर्ग को एक टाइल से ढंकना चाहिए। यहां दो टाइलिंग अलग-अलग हैं यदि और केवल तभी जब बोर्ड पर दो 4-प्रत्यक्ष रूप से आसन्न कोशिकाएं हों, जैसे कि टाइलिंग में से एक में द