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

C++ में बम रखकर अधिकतम दुश्मनों को मारना


मान लीजिए हमारे पास एक 2D मैट्रिक्स है जिसमें तीन अलग-अलग मान हैं: 2 (दुश्मन), 1 (दीवार), और 0 (खाली सेल)। हमें एक बम का उपयोग करके अधिकतम दुश्मनों को मारने की संख्या ज्ञात करनी है। बम लगाए गए बिंदु से उसी पंक्ति और कॉलम में सभी दुश्मनों को मार देता है जब तक कि दीवार न आ जाए। और हम बम केवल खाली स्थानों पर रख सकते हैं।

उदाहरण के लिए, दिए गए मैट्रिक्स के लिए आउटपुट 3 होगा, क्योंकि हम हरे बॉक्स पर बम रखकर अधिकतम 3 दुश्मनों को मार सकते हैं।

C++ में बम रखकर अधिकतम दुश्मनों को मारना

समाधान दृष्टिकोण

  • प्रत्येक पंक्ति और कॉलम के लिए, दीवारों के बीच के सेगमेंट में दुश्मनों की गिनती प्रीकंप्यूट करें।
  • rowCnt - वर्तमान पंक्ति सेगमेंट में दुश्मनों की संख्या।
  • colCnt[j] - कॉलम j के वर्तमान सेगमेंट में दुश्मनों की संख्या।
  • प्रत्येक सेल (i,j) के लिए: यदि यह खाली है (0), तो ret = max(ret, rowCnt + colCnt[j]) अपडेट करें।

उदाहरण (C++ कोड)

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

class Solution { 
public: 
    int solve(vector<vector<int>>& grid) { 
        int ret = 0; 
        int n = grid.size(); 
        int m = n ? grid[0].size() : 0; 
        int rowCnt = 0; 
        vector<int> colCnt(m); 
        for (int i = 0; i < n; i++) { 
            for (int j = 0; j < m; j++) { 
                if (j == 0 || grid[i][j] == 1) { 
                    rowCnt = 0; 
                    int k = (grid[i][j] == 1) ? j + 1 : j; 
                    for (; k < m && grid[i][k] != 1; k++) 
                        rowCnt += (grid[i][k] == 2); 
                } 
                if (i == 0 || grid[i][j] == 1) { 
                    colCnt[j] = 0; 
                    int k = (grid[i][j] == 1) ? i + 1 : i; 
                    for (; k < n && grid[k][j] != 1; k++) 
                        colCnt[j] += (grid[k][j] == 2); 
                } 
                if (grid[i][j] == 0) 
                    ret = max(ret, rowCnt + colCnt[j]); 
            } 
        } 
        return ret; 
    } 
}; 

int main() { 
    Solution ob; 
    vector<vector<int>> v = {{0,2,0,0}, {2,0,1,2}, {0,2,0,0}}; 
    cout << ob.solve(v); 
    return 0; 
}

इनपुट

{{0,2,0,0}, {2,0,1,2}, {0,2,0,0}}

आउटपुट

3

  1. - C++ प्रोग्राम: अधिकतम एज-डिस्जॉइंट पथ की संख्या ज्ञात करना

    यह दो वर्टेक्स के बीच सबसे छोटे सबसेट पथ या अधिकतम प्रवाह का अर्थ रखने वाले अधिकतम एज-डिस्जॉइंट पथ की संख्या ज्ञात करने के लिए एक C++ प्रोग्राम है। एल्गोरिदम: Begin    function bfs() returns true if there is path from source s to sink t in    the residual graph which indicates

  1. - C++ में रिकर्सन का उपयोग करके किसी संख्या का फैक्टोरियल खोजने का प्रोग्राम

    एक गैर-ऋणात्मक पूर्णांक n का फैक्टोरियल उन सभी धनात्मक पूर्णांकों का गुणनफल होता है जो n से कम या बराबर होते हैं। उदाहरण के लिए: 4 का फैक्टोरियल 24 है। 4! = 4 * 3 * 2 *1 4! = 24 एक पूर्णांक का फैक्टोरियल रिकर्सिव प्रोग्राम या इटरेटिव प्रोग्राम का उपयोग करके पाया जा सकता है। निम्नलिखित प्रोग्राम एक स

  1. - पायथन में ऐरे से दो अलग-अलग एलिमेंट्स का अधिकतम गुणनफल ढूंढने का प्रोग्राम

    मान लीजिए हमारे पास nums नामक संख्याओं की सूची है, हमें दो यूनिक एलिमेंट्स का सबसे बड़ा गुणनफल ढूंढना है। तो, यदि इनपुट nums = [8, -3, 1, -5] है, तो आउटपुट 15 होगा, (-3)*(-5) = 15 जो यहां अधिकतम है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे: n := nums का आकार nums_sort := सूची nums को सॉर्ट कर