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

C++ में योग K के बराबर वाले सबसे बड़े क्षेत्रफल वाले आयताकार सब-मैट्रिक्स को खोजें


मान लीजिए हमारे पास एक 2D मैट्रिक्स mat और एक मान K है, हमें सबसे लंबे आयताकार सब-मैट्रिक्स को खोजना है जिसका योग K के बराबर हो।

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

2 8 -5 6
-7 7 8 -3
11 -14 4 3
-4 3 1 10

और K = 9

तो आउटपुट होगा: टॉप-लेफ्ट पॉइंट (1, 0) और बॉटम-राइट पॉइंट (3, 2)।

-7 7 8
11 -14 4
-4 3 1

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

  • MAX := 100
  • sum_k() नामक एक फंक्शन परिभाषित करें, जो एक ऐरे arr, स्टार्ट, एंड, n, k लेता है:
    • एक मैप परिभाषित करें
    • सम := 0, मैक्सिमम_लेंथ := 0
    • i := 0 से n-1 तक लूप करें:
      • सम := सम + arr[i]
      • यदि सम K के बराबर है: मैक्सिमम_लेंथ := i + 1, स्टार्ट := 0, एंड := i
      • यदि सम मैप में नहीं है: मैप[सम] := i
      • यदि (सम - k) मैप में है: यदि मैक्सिमम_लेंथ < (i - मैप[सम - k]), तो मैक्सिमम_लेंथ, स्टार्ट, एंड अपडेट करें
    • यदि मैक्सिमम_लेंथ 0 नहीं है तो true लौटाएं
  • मेन मेथड से:
    • रो := mat की पंक्ति संख्या, कॉल := mat की स्तंभ संख्या
    • आकार रो का एक ऐरे temp परिभाषित करें
    • फाइनल_पॉइंट = {0,0,0,0} ऐरे परिभाषित करें
    • मैक्सएरिया := -inf
    • लेफ्ट := 0 से कॉल-1 तक लूप करें:
      • temp को 0 से भरें
      • राइट := लेफ्ट से कॉल-1 तक लूप करें:
        • i := 0 से रो-1 तक लूप करें: temp[i] := temp[i] + mat[i][राइट]
        • सम := sum_k(temp, अप, डाउन, रो, k)
        • क्षेत्रफल := (डाउन - अप + 1) * (राइट - लेफ्ट + 1)
        • यदि सम शून्येतर है और मैक्सएरिया < क्षेत्रफल: फाइनल_पॉइंट और मैक्सएरिया अपडेट करें
    • यदि फाइनल_पॉइंट [0,0,0,0] है और mat[0][0] K नहीं है, तो "No sub-matrix found" लौटाएं
    • टॉप-लेफ्ट पॉइंट (फाइनल_पॉइंट[0], फाइनल_पॉइंट[2]) प्रदर्शित करें
    • बॉटम-राइट पॉइंट (फाइनल_पॉइंट[1], फाइनल_पॉइंट[3]) प्रदर्शित करें
    • मैट तत्व प्रदर्शित करें

उदाहरण

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

#include <bits/stdc++.h> using namespace std; const int MAX = 100; bool sum_k(int arr[], int& start, int& end, int n, int k) { unordered_map<int, int> map; int sum = 0, maximum_length = 0; for (int i = 0; i < n; i++) { sum += arr[i]; if (sum == k) { maximum_length = i + 1; start = 0; end = i; } if (map.find(sum) == map.end()) map[sum] = i; if (map.find(sum - k) != map.end()) { if (maximum_length < (i - map[sum - k])) { maximum_length = i - map[sum - k]; start = map[sum - k] + 1; end = i; } } } return (maximum_length != 0); } void sum_zero(vector<vector<int>> &mat, int k) { int row = mat.size(); int col = mat[0].size(); int temp[row], area; bool sum; int up, down; vector<int> final_point = {0,0,0,0}; int maxArea = INT_MIN; for (int left = 0; left < col; left++) { memset(temp, 0, sizeof(temp)); for (int right = left; right < col; right++) { for (int i = 0; i < row; i++) temp[i] += mat[i][right]; sum = sum_k(temp, up, down, row, k); area = (down - up + 1) * (right - left + 1); if (sum && maxArea < area) { final_point[0] = up; final_point[1] = down; final_point[2] = left; final_point[3] = right; maxArea = area; } } } if (final_point[0] == 0 && final_point[1] == 0 && final_point[2] == 0 && final_point[3] == 0 && mat[0][0] != k) { cout << "No sub-matrix found"; return; } cout << "(Top, Left) Coordinate: " << "(" << final_point[0] << ", " << final_point[2] << ")" << endl; cout << "(Bottom, Right) Coordinate: " << "(" << final_point[1] << ", " << final_point[3] << ")" << endl; for (int j = final_point[0]; j <= final_point[1]; j++) { for (int i = final_point[2]; i <= final_point[3]; i++) cout << mat[j][i] << " "; cout << endl; } } main(){ vector<vector<int>> v = { { 2, 8, -5, 6 }, { -7, 7, 8, -3 }, { 11, -14, 4, 3 }, { -4, 3, 1, 10 }}; sum_zero(v, 9); }

इनपुट

{{ 2, 8, -5, 6 }, { -7, 7, 8, -3 }, { 11, -14, 4, 3 }, { -4, 3, 1, 10 }}, 9

आउटपुट

(Top, Left) Coordinate: (1, 0) (Bottom, Right) Coordinate: (3, 2) -7 7 8 11 -14 4 -4 3 1

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

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

  1. C++ में दीर्घवृत्त में अंतर्निहित सबसे बड़े वृत्त का क्षेत्रफल ज्ञात करें C++ में दीर्घवृत्त में अंतर्निहित सबसे बड़े वृत्त का क्षेत्रफल ज्ञात करें

    मान लीजिए हमारे पास एक दीर्घवृत्त है, जिसकी प्रमुख और लघु अक्ष की लंबाई 2a और 2b है। हमें इसमें अंतर्निहित सबसे बड़े वृत्त का क्षेत्रफल ढूंढना है। इसलिए यदि a = 5 और b = 3, तो क्षेत्रफल 28.2734 होगा। हम देख सकते हैं कि दीर्घवृत्त में अंतर्निहित अधिकतम क्षेत्रफल वाले वृत्त की त्रिज्या लघु अक्ष b होग

  1. C++ में हेक्सागन में अंकित सबसे बड़े त्रिभुज का क्षेत्रफल C++ में हेक्सागन में अंकित सबसे बड़े त्रिभुज का क्षेत्रफल

    यहां हम नियमित हेक्सागन में अंकित सबसे बड़े त्रिभुज का क्षेत्रफल देखेंगे। हेक्सागन की प्रत्येक भुजा a है, और त्रिभुज की प्रत्येक भुजा b है। इस आरेख से हम देख सकते हैं कि यदि हम हेक्सागन की एक भुजा का उपयोग करके एक त्रिभुज बनाते हैं, तो ये दो त्रिभुज प्रत्येक भुजा को दो भागों में विभाजित कर रहे हैं।