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

ग्रिड में अधिकतम रोशन की जा सकने वाली सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम


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

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

छवि से हम ग्रिड में रोशन सेल्स देख सकते हैं।

चरण

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

एक 2D सरणी first परिभाषित करें
i := 0 से h-1 तक:
    count := 0
    j := 0 से w-1 तक:
        यदि grid[i][j] == '#', तो:
            count := 0
            जारी रखें
        अन्यथा:
            first[i][j] := count
            count बढ़ाएँ
    k := 0
    j := w-1 से 0 तक घटाते हुए:
        यदि grid[i][j] == '#', तो:
            k := 0
            जारी रखें
        अन्यथा:
            k := max(k, first[i][j])
            first[i][j] := k
एक 2D सरणी second परिभाषित करें
j := 0 से w-1 तक:
    count := 0
    i := 0 से h-1 तक:
        यदि grid[i][j] == '#', तो:
            count := 0
            जारी रखें
        अन्यथा:
            second[i][j] := count
            count बढ़ाएँ
    k := 0
    i := h-1 से 0 तक घटाते हुए:
        यदि grid[i][j] == '#', तो:
            k := 0
            जारी रखें
        अन्यथा:
            k := max(k, second[i][j])
            second[i][j] := k
result := 0
i := 0 से h-1 तक:
    j := 0 से w-1 तक:
        result := max(result, first[i][j] + second[i][j])
result + 1 लौटाएँ

उदाहरण

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

#include <bits/stdc++.h> using namespace std; int solve(int h, int w, vector<string> grid){    vector<vector<int>> first(h, vector<int> (w));    for(int i = 0; i < h; i++) {       int count = 0;       for(int j = 0; j < w; j++) {          if(grid[i][j] == '#') {             count = 0;             continue;          } else {             first[i][j] = count;             count++;          }       }       int k = 0;       for(int j = w-1; j >= 0; j--) {          if(grid[i][j] == '#') {             k = 0;             continue;          } else {             k = max(k, first[i][j]);             first[i][j] = k;          }       }    }    vector<vector<int>> second(h, vector<int> (w));    for(int j = 0; j < w; j++) {       int count = 0;       for(int i = 0; i < h; i++) {          if(grid[i][j] == '#') {             count = 0;             continue;          } else {             second[i][j] = count;             count++;          }       }       int k = 0;       for(int i = h-1; i >= 0; i--) {          if(grid[i][j] == '#') {             k = 0;             continue;          } else {             k = max(k, second[i][j]);             second[i][j] = k;          }        }     }     int result = 0;     for(int i = 0; i < h; i++) {        for(int j = 0; j < w; j++) {           result = max(result, first[i][j] + second[i][j]);        }     }     return result + 1; } int main() { int h = 4, w = 4; vector<string> grid = {"#...", "....", "...#", "...."}; cout<< solve(h, w, grid); return 0; }

इनपुट

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

आउटपुट

7
  1. ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम

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

  1. ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक भारित, निदेश रहित ग्राफ दिया गया है। ग्राफ का स्कोर ग्राफ में सभी एज भारों का योग है। एज भार ऋणात्मक हो सकते हैं, और यदि उन्हें हटा दिया जाए तो ग्राफ का स्कोर बढ़ जाता है। हमें ग्राफ को संबद्ध रखते हुए एज हटाकर ग्राफ के स्कोर को न्यूनतम करना है। हमें घटाए जा सकन

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

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