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

C++ में बम एनिमी - अधिकतम दुश्मनों को मारने का स्थान खोजें


समस्या विवरण

मान लीजिए हमारे पास एक 2D ग्रिड है, जहां प्रत्येक सेल या तो दीवार 'W', दुश्मन 'E' या खाली '0' है। हमें एक बम का उपयोग करके अधिकतम दुश्मनों को मारने की संख्या ढूंढनी है। बम लगाए गए बिंदु से उसी पंक्ति और स्तंभ में सभी दुश्मनों को मारता है जब तक यह दीवार से नहीं टकराता। और हम बम केवल खाली स्थानों पर रख सकते हैं।

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

C++ में बम एनिमी - अधिकतम दुश्मनों को मारने का स्थान खोजें

तो आउटपुट 3 होगा, क्योंकि हरे स्थान पर बम रखने से यह तीन दुश्मनों को मार देगा।

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

प्रीकंप्यूटेशन के साथ O(mn) समय में:

  1. ret := 0
  2. n := ग्रिड की पंक्ति संख्या, m := स्तंभ संख्या
  3. आकार m की सरणी colCnt परिभाषित करें
  4. प्रत्येक सेल (i, j) के लिए:
    • पंक्ति गणना (rowCnt) की गणना करें - बाएं/दाएं दीवार तक दुश्मन
    • स्तंभ गणना (colCnt[j]) की गणना करें - ऊपर/नीचे दीवार तक दुश्मन
    • यदि ग्रिड[i][j] == '0', तो ret = max(ret, rowCnt + colCnt[j]) अपडेट करें
  5. ret लौटाएं

C++ कार्यान्वयन

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

class Solution { 
public: 
    int maxKilledEnemies(vector<vector<char>>& 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 || grid[i][j] == 'W') { 
                    rowCnt = 0; 
                    int k; 
                    if (grid[i][j] == 'W') 
                        k = j + 1; 
                    else 
                        k = j; 
                    for (; k < m && grid[i][k] != 'W'; k++) { 
                        rowCnt += (grid[i][k] == 'E'); 
                    } 
                } 
                
                if (!i || grid[i][j] == 'W') { 
                    colCnt[j] = 0; 
                    int k; 
                    if (grid[i][j] == 'W') 
                        k = i + 1; 
                    else 
                        k = i; 
                    for (; k < n && grid[k][j] != 'W'; k++) { 
                        colCnt[j] += (grid[k][j] == 'E'); 
                    } 
                } 
                
                if (grid[i][j] == '0') { 
                    ret = max(ret, rowCnt + colCnt[j]); 
                } 
            } 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<vector<char>> v = {{'0','E','0','0'},{'E','0','W','E'},{'0','E','0','0'}}; 
    cout << (ob.maxKilledEnemies(v)); 
    return 0;
}

इनपुट

{{'0','E','0','0'},{'E','0','W','E'},{'0','E','0','0'}}

आउटपुट

3
  1. - C++ कोड: दुश्मन को मारने के लिए हथियारों के साथ न्यूनतम चाल खोजें

    मान लीजिए हमारे पास n तत्वों की एक सरणी A है, और एक अन्य संख्या H है। H दुश्मन का स्वास्थ्य है। हमारे पास n हथियार हैं और iवें हथियार की हानिकारक शक्ति A[i] है। दुश्मन को मारने के लिए विभिन्न हथियारों का उपयोग किया जा सकता है। हम एक ही हथियार को लगातार दो बार उपयोग नहीं कर सकते। हमें दुश्मन को मारने

  1. - C++ में मितव्ययी संख्या (Frugal Number)

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया गया है। हमारा कार्य यह जांचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या (FRUGAL NUMBER) − एक संख्या जिसके अंकों की संख्या उस संख्या के अभाज्य गुणनखंडन में अंकों की संख्या से सख्ती से अधिक है। उदाहरण &

  1. C++ में पेंटाटोप संख्या C++ में पेंटाटोप संख्या

    एक पेंटाटोप संख्या को पास्कल के त्रिभुज में पांचवीं संख्या के रूप में वर्णित किया गया है। अब, चूंकि यह पांचवीं संख्या है, इसका मतलब है कि पास्कल के त्रिभुज में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है जो पास्कल के त्रिभुज की चौथी पंक्ति है। तो, इस