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

C++ में बाइनरी मैट्रिक्स में सबसे छोटा पथ

मान लीजिए कि हमारे पास एन से एन वर्ग ग्रिड है, वहां प्रत्येक सेल या तो खाली है (0) या अवरुद्ध (1)। ऊपर-बाएं से नीचे-दाएं तक एक स्पष्ट पथ की लंबाई k होती है यदि और केवल यदि यह कोशिकाओं C_1, C_2, ..., C_k से बना हो तो -

  • आसन्न सेल C_i और C_{i+1} 8-प्रत्यक्ष रूप से जुड़े हुए हैं (इसलिए वे अलग हैं और एक किनारे या कोने को साझा करते हैं)

  • C_1 स्थान पर है (0, 0)

  • C_k स्थान पर है (N-1, N-1)

  • यदि C_i (r, c) पर स्थित है, तो grid[r, c] खाली है या इसमें 0

    . है

हमें ऊपर-बाएँ से नीचे-दाएँ तक ऐसे सबसे छोटे स्पष्ट पथ की लंबाई ज्ञात करनी है। अगर ऐसा कोई रास्ता नहीं है, तो -1 लौटें।

उदाहरण के लिए, यदि ग्रिड की तरह है -

0 0 0
1 1 0
1 1 0

नारंगी कोशिकाएं पथ होंगी। लंबाई 4

. है

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

  • एक दिशा सरणी को परिभाषित करें, यह 8 अलग-अलग दिशाओं को स्थानांतरित करने के लिए 8 जोड़े रखेगा। तो यह सरणी [[1,1], [1,-1], [-1,1], [1,0], [0,1], [-1,-1], [0,- की तरह है। 1], [-1,0]]

  • मुख्य खंड ग्रिड को इनपुट के रूप में लेगा, यह नीचे की तरह कार्य करेगा -

  • बिंदुओं की एक कतार परिभाषित करें, q, n:=पंक्तियों की संख्या

  • अगर ग्रिड [0, 0] 0 ​​है, तो एक नया बिंदु p(0, 0, 1) बनाएं, p को q में डालें, और ग्रिड बनाएं[0, 0] :=1

  • जबकि q खाली नहीं है

    • curr :=q से सामने का बिंदु, q से सामने का बिंदु हटाएं

    • x :=curr का मान, y :=y curr का मान, c :=c curr का मान

    • अगर x =n – 1 और y =n – 1 है, तो वापस c

    • c को 1 से बढ़ाएँ

    • मेरे लिए 0 से 7 की सीमा में

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

      • यदि X श्रेणी में 0 और n और y श्रेणी 0 और n में है, और ग्रिड [X, Y] 0 है, तो

        • ग्रिड [एक्स, वाई] :=1

        • q में एक नया बिंदु p (X, Y, c) डालें

  • वापसी -1

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int d[8][2] = {{1, 1}, {1, -1}, {-1, 1}, {1, 0}, {0, 1}, {-1, -1},
{0, -1}, {-1, 0}};
struct point{
   int x, y, c;
   point(int a, int b, int z){
      x = a;
      y = b;
      c = z;
   }
};
class Solution {
   public:
   int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
      queue <point> q;
      int n = grid.size();
      if(!grid[0][0]){
         q.push(point(0, 0, 1));
         grid[0][0] = 1;
      }
      while(!q.empty()){
         point curr = q.front();
         q.pop();
         int x = curr.x;
         int y = curr.y;
         int c = curr.c;
         if(x == n-1 && y == n-1)return c;
            c++;
         for(int i = 0; i < 8; i++){
            int X = x + d[i][0];
            int Y = y + d[i][1];
            if(X >= 0 && X < n && Y >= 0 && Y < n &&
            !grid[X][Y]){
               grid[X][Y] = 1;
               q.push(point(X, Y, c));
            }
         }
      }
      return -1;
   }
};
main(){
   vector<vector<int>> v = {{0,0,0},{1,1,0},{1,1,0}};
   Solution ob;
   cout << (ob.shortestPathBinaryMatrix(v));
}

इनपुट

[[0,0,0],[1,1,0],[1,1,0]]

आउटपुट

4

  1. C++ में एक बाइनरी ट्री में सबसे लंबा ज़िगज़ैग पथ

    मान लीजिए कि हमारे पास एक बाइनरी ट्री रूट है, एक बाइनरी ट्री के लिए एक ज़िगज़ैग पथ को निम्नानुसार परिभाषित किया गया है - बाइनरी ट्री और दिशा में कोई भी नोड चुनें (दाएं या बाएं)। यदि वर्तमान दिशा सही है तो वर्तमान नोड के दाहिने बच्चे की ओर बढ़ो अन्यथा बाएं बच्चे की ओर बढ़ो। फिर दिशा को दाएं

  1. C++ में एक बाइनरी ट्री में अधिकतम पथ योग

    इस समस्या में, हमें एक बाइनरी ट्री दिया जाता है जिसमें प्रत्येक नोड में एक मान होता है। हमारा काम एक बाइनरी ट्री की दो पत्तियों के बीच अधिकतम पथ योग खोजने के लिए एक प्रोग्राम बनाना है। यहां, हमें एक लीफ नोड से दूसरे लीफ नोड के लिए पथ फॉर्म ढूंढना होगा जो अधिकतम मूल्यों को प्रदान करेगा। इस अधिकतम यो

  1. C++ प्रोग्रामिंग में बाइनरी ट्री में पहला सबसे छोटा रूट टू लीफ पाथ प्रिंट करें।

    बाइनरी ट्री को देखते हुए प्रोग्राम को दिए गए कई रास्तों में से रूट से लीफ तक के सबसे छोटे रास्ते का पता लगाना चाहिए। चूँकि हम पेड़ को बाएँ से दाएँ पार करते हैं, इसलिए यदि जड़ से पत्ती तक कई छोटे रास्ते हैं, तो प्रोग्राम पेड़ के बाईं ओर सबसे छोटा रास्ता सबसे पहले ट्रैवर्स करेगा। हम एक कतार का उपयोग