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

लैंप द्वारा रोशन सभी सेल के योग को ढूंढने के लिए C++ प्रोग्राम


मान लीजिए हमारे पास H पंक्तियों और W कॉलम वाला एक ग्रिड है। जहां प्रत्येक वर्ग साफ या गंदा है। हम इस ग्रिड में शून्य या अधिक साफ वर्गों पर लैंप रख सकते हैं। एक लैंप चार दिशाओं में से प्रत्येक में सेल को रोशन कर सकता है - ऊपर, नीचे, बाएं, और दाएं - ग्रिड के किनारे या पहली बार गंदे वर्ग तक पहुंचने से ठीक पहले तक (गंदा सेल रोशन नहीं होगा)। लैंप उस सेल को भी रोशन करेगा जिस पर वह रखा गया है। ग्रिड में यदि G[i, j] '.' है तो वह सेल साफ है और जब यह '#' है तो यह गंदा है। मान लें K साफ वर्गों की संख्या है। लैंप रखने के कुल 2^K तरीके हैं। मान लें कि, इन 2^K तरीकों में से प्रत्येक के लिए, एक या अधिक लैंप द्वारा रोशन सेल की संख्या की गणना की जाती है। हमें उन संख्याओं का योग 10^9 + 7 मॉड्यूलो ढूंढना है।

उदाहरण के लिए, यदि इनपुट है:

. . #
# . .

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

चरण

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

m := 10^9 + 7 N = 2003 क्रम N x N के 2D ऐरे u, l, r, d परिभाषित करें, और N^2 तत्वों वाली एक सूची p। h := मैट्रिक्स की पंक्ति संख्या w := मैट्रिक्स की कॉलम संख्या tidy := 0 p[0] := 1 i := 1 से h * w तक, करें: p[i] := p[i - 1] * 2 mod m i := 0 से h-1 तक, करें: j := 0 से w-1 तक, करें: u[i, j] := i l[i, j] := j यदि i शून्येतर है, तो: u[i, j] := u[i - 1, j] यदि j शून्येतर है, तो: l[i, j] := l[i, j - 1] यदि matrix[i, j], '#' के बराबर है, तो: u[i, j] := i + 1 l[i, j] := j + 1 अन्यथा tidy बढ़ाएं i := h - 1 से 0 तक, करें: j := w - 1 से 0 तक, करें: d[i, j] := i r[i, j] := j यदि i < h - 1, तो: d[i, j] := d[i + 1, j] यदि j < w - 1, तो: r[i, j] := r[i, j + 1] यदि matrix[i, j], '#' के बराबर है, तो: d[i, j] := i - 1 r[i, j] := j - 1 cnt := 0 i := 0 से h-1 तक, करें: j := 0 से w-1 तक, करें: यदि matrix[i, j], '#' के बराबर है, तो: अगले पुनरावृत्ति पर जाएं src := d[i, j] + r[i, j] - u[i, j] - l[i, j] + 1 cnt := (cnt + (p[src] - 1) * p[tidy - src]) mod m cnt वापस करें

उदाहरण

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

#include <bits/stdc++.h> using namespace std; const int m = 1e9 + 7, N = 2003; int u[N][N], l[N][N], r[N][N], d[N][N], p[N * N]; int solve(vector<vector<char>> matrix){    int h = matrix.size();    int w = matrix[0].size();    int tidy = 0;    p[0] = 1;    for (int i = 1; i <= h * w; ++i)       p[i] = p[i - 1] * 2 % m;    for (int i = 0; i < h; ++i){       for (int j = 0; j < w; ++j){          u[i][j] = i;          l[i][j] = j;          if (i)             u[i][j] = u[i - 1][j];          if (j)             l[i][j] = l[i][j - 1];          if (matrix[i][j] == '#'){             u[i][j] = i + 1;             l[i][j] = j + 1;          }          else             ++tidy;       }    }    for (int i = h - 1; i >= 0; --i){       for (int j = w - 1; j >= 0; --j){          d[i][j] = i;          r[i][j] = j;          if (i < h - 1)             d[i][j] = d[i + 1][j];          if (j < w - 1)             r[i][j] = r[i][j + 1];          if (matrix[i][j] == '#'){             d[i][j] = i - 1;             r[i][j] = j - 1;          }       }    }    int cnt = 0;    for (int i = 0; i < h; ++i){       for (int j = 0; j < w; ++j){          if (matrix[i][j] == '#')             continue;          int src = d[i][j] + r[i][j] - u[i][j] - l[i][j] + 1;          cnt = (cnt + (p[src] - 1) * p[tidy - src]) % m;       }    }    return cnt; } int main(){    vector<vector<char>> matrix = { { '.', '.', '#' }, { '#', '.', '.' } };    cout << solve(matrix) << endl; }

इनपुट

3, 2, { 1, 5, 9 }, { 2, 4, 2 }

आउटपुट

52

  1. C++ में त्रिभुज के केंद्रक (Centroid) ज्ञात करने का प्रोग्राम C++ में त्रिभुज के केंद्रक (Centroid) ज्ञात करने का प्रोग्राम

    इस समस्या में, हमें एक 2D ऐरे दिया गया है जो त्रिभुज के तीन शीर्षों के निर्देशांक को दर्शाता है। हमारा कार्य C++ में त्रिभुज के केंद्रक (Centroid) ज्ञात करने का प्रोग्राम बनाना है।केंद्रक (Centroid) त्रिभुज का वह बिंदु है जहां त्रिभुज की तीनों मध्यिकाएं (medians) प्रतिच्छेद करती हैं।मध्यिका (Median)

  1. C++ में समानांतर चतुर्भुज (Parallelogram) का क्षेत्रफल ज्ञात करने का प्रोग्राम C++ में समानांतर चतुर्भुज (Parallelogram) का क्षेत्रफल ज्ञात करने का प्रोग्राम

    इस समस्या में, हमें दो मान दिए गए हैं जो समानांतर चतुर्भुज के आधार (base) और ऊंचाई (height) को दर्शाते हैं। हमारा कार्य C++ में समानांतर चतुर्भुज (Parallelogram) का क्षेत्रफल ज्ञात करने का प्रोग्राम बनाना है।समानांतर चतुर्भुज (Parallelogram) चार भुजाओं वाली एक बंद आकृति है जिसकी विपरीत भुजाएं समान औ

  1. C++ में दिए गए परफेक्ट बाइनरी ट्री के सभी नोड्स का योग ज्ञात करें C++ में दिए गए परफेक्ट बाइनरी ट्री के सभी नोड्स का योग ज्ञात करें

    मान लीजिए हमारे पास एक धनात्मक पूर्णांक L है, जो परफेक्ट बाइनरी ट्री में स्तरों की संख्या दर्शाता है। इस परफेक्ट बाइनरी ट्री में पत्ती नोड्स को 1 से n तक संख्या दी गई है। जहां n पत्ती नोड्स की संख्या है। पैरेंट नोड बच्चों का योग है। हमारा कार्य इस परफेक्ट बाइनरी ट्री के सभी नोड्स का योग प्रिंट करने