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

C++ प्रोग्राम एक अनब्लॉक सेल को ग्रिड में दूसरे अनब्लॉक सेल तक पहुंचने के लिए अधिकतम संख्या में मूव्स का पता लगाने के लिए

मान लीजिए, हमें आयामों का एक ग्रिड दिया गया है h * w जिसमें दो प्रकार के सेल होते हैं, ब्लॉक और अनब्लॉक। अवरुद्ध कोशिकाओं का अर्थ है कि कोशिकाएँ पहुँच योग्य नहीं हैं और अवरोधरहित का अर्थ है कि कोशिकाएँ पहुँच योग्य हैं। हम 2डी सरणी में ग्रिड का प्रतिनिधित्व करते हैं जहां अवरुद्ध कोशिकाओं को '#' के रूप में दिया जाता है और अनब्लॉक कोशिकाओं को '।' के रूप में दिया जाता है। अब, हमें ग्रिड में एक अनब्लॉक सेल से दूसरे अनब्लॉक सेल तक पहुंचना है। हम केवल दो चालें कर सकते हैं, हम या तो लंबवत जा सकते हैं या हम क्षैतिज जा सकते हैं। हम तिरछे नहीं चल सकते। हमें यह ध्यान रखना होगा कि, हम केवल अनब्लॉक किए गए सेल में जा सकते हैं। इसलिए, हमें ग्रिड में किसी अन्य अनब्लॉक सेल से एक अनब्लॉक सेल तक पहुंचने के लिए आवश्यक चालों की अधिकतम संख्या का पता लगाना होगा।

इसलिए, यदि इनपुट h =4, w =4, grid ={"..#.", "#.#.", "..##", "###."} जैसा है, तो आउटपुट 4 होगा।

सेल (0,0) से, सेल (2, 0) तक पहुंचने के लिए अधिकतम 4 चालों की आवश्यकता होती है।

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

Define an array xdir of size: 4 := {1, 0, - 1, 0}
Define an array ydir of size: 4 := {0, 1, 0, - 1}
Define one 2D array dist
Define one 2D array reset
res := 0
for initialize i := 0, when i < h, update (increase i by 1), do:
   for initialize j := 0, when j < w, update (increase j by 1), do:
      dist := reset
      if grid[i, j] is same as '.', then:
         dist[i, j] := 0
         Define one queue q containing integer pairs
         insert make_pair(i, j) into q
         while (not q is empty), do:
            x := first element of the leftmost element in the q
            y := second element of the leftmost element in the q
            res := maximum of (dist[x, y] and res)
            delete leftmost element from q
            for initialize k := 0, when k < 4, update (increase k by 1), do:
               px := x + xdir[k]
               py := y + ydir[k]
               if px >= 0 and px < h and py >= 0 and py < w, then:
                  if grid[px, py] is same as '.', then:
                     if dist[px, py] is same as -1, then:
                        dist[px, py] := dist[x, y] + 1
                        insert pair(px, py) into q
return res

उदाहरण

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

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

int solve(int h, int w, vector<string> grid){
   int xdir[4] = {1, 0, -1, 0};
   int ydir[4] = {0, 1, 0, -1};
   vector<vector<int>> dist(h, vector<int>(w, -1));
   vector<vector<int>> reset(h, vector<int>(w, -1));
   int res = 0;
   for(int i = 0; i < h; i++){
      for(int j = 0; j < w; j++){
          dist = reset;
          if(grid[i][j] == '.'){
             dist[i][j] = 0;
             queue<pair<int,int>> q;
             q.push(make_pair(i, j));
             while(!q.empty()){
                int x = q.front().first;
                int y = q.front().second;
                res = max(dist[x][y], res);
                q.pop();
                for(int k = 0; k < 4; k++){
                   int px = x + xdir[k];
                   int py = y + ydir[k];
                   if(px >= 0 && px < h && py >= 0 && py < w){
                      if(grid[px][py] == '.'){
                         if(dist[px][py] == -1){
                            dist[px][py] = dist[x][y] + 1; q.push(make_pair(px, py));
                         }
                      }
                   }
                }
             }
         }
      }
   }
   return res;
}
int main() {
   int h = 4, w = 4;
   vector<string> grid = {"..#.", "#.#.", "..##", "###."};
   cout << solve(h, w, grid);
   return 0;
}

इनपुट

4, 4, {"..#.", "#.#.", "..##", "###."}

आउटपुट

4

  1. C++ प्रोग्राम एक ग्रिड में प्रबुद्ध कोशिकाओं की संख्या का पता लगाने के लिए

    मान लीजिए, हमें h * w आयामों का एक ग्रिड दिया गया है। ग्रिड में कोशिकाओं में या तो बल्ब या बाधाएं हो सकती हैं। एक लाइट बल्ब सेल स्वयं को और उसके दाएं, बाएं, ऊपर और नीचे की कोशिकाओं को रोशन करता है और प्रकाश कोशिकाओं के माध्यम से चमक सकता है जब तक कि कोई बाधा सेल प्रकाश को अवरुद्ध न करे। एक बाधा सेल

  1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

  1. पथ बनाने के लिए ग्रिड में ब्लॉक करने के लिए कोशिकाओं की संख्या का पता लगाने के लिए सी ++ प्रोग्राम

    मान लीजिए, h * w आयामों का एक ग्रिड है। सेल स्थिति (0, 0) में एक रोबोट है और उसे स्थिति (h-1, w-1) पर जाना है। एक ग्रिड में दो प्रकार के सेल होते हैं, ब्लॉक और अनब्लॉक। रोबोट अनब्लॉक की गई कोशिकाओं से गुजर सकता है लेकिन अवरुद्ध कोशिकाओं से नहीं गुजर सकता। रोबोट चार दिशाओं में जा सकता है; यह बाएँ, दा