কম্পিউটার টিউটোরিয়াল

C++-এ ম্যাট্রিক্স থেকে নির্দিষ্ট সম্মানিত সাবম্যাট্রিক্সের সংখ্যা বের করার প্রোগ্রাম


ধরা যাক একটি ম্যাট্রিক্স দেওয়া আছে যাতে পূর্ণসংখ্যা মান রয়েছে। আমাদের এমন সাবম্যাট্রিক্স বের করতে হবে যাদের উপাদানগুলোর যোগফল একটি দেওয়া টার্গেট সমানের সমান। সাবম্যাট্রিক্সের সংখ্যা রিটার্ন করতে হবে।

উদাহরণস্বরূপ, ম্যাট্রিক্স = {{0,0,1,0},{0,1,0,0},{0,1,0,1},{1,1,0,1}} এবং target = 5 হলে আউটপুট হবে ৩।

নোট: মূল টেক্সটে "sum of elements is equal to 6" বলা হয়েছে, কিন্তু ইনপুটে target 5 দেওয়া আছে। সঠিক আউটপুট ৫ টার্গেটের জন্য ৩।

সমাধানের ধাপসমূহ

  • n := ম্যাট্রিক্সের সাইজ (রো)
  • m := কলামের সাইজ (যদি n=0 হয় তবে ০)
  • যদি m > n হয়, তবে ম্যাট্রিক্স ট্রান্সপোজ করে সমস্যা সমাধান করুন
  • ans := ০
  • প্রতিটি কলাম p = 0 থেকে m-1 পর্যন্ত:
    • আকার n-এর একটি অ্যারে arr সংজ্ঞায়িত করুন
    • q = p থেকে m-1 পর্যন্ত:
      • প্রতিটি রো i এর জন্য arr[i] += mat[i][q] করুন
      • একটি ম্যাপ pcnt তৈরি করুন যাতে {0, 1} থাকে
      • pref := ০
      • প্রতিটি রো i = 0 থেকে n-1 পর্যন্ত:
        • pref += arr[i]
        • যদি (pref - sumTarget) pcnt-এ থাকে, তবে ans += pcnt[pref - sumTarget]
        • pcnt[pref]++
  • ans রিটার্ন করুন

উদাহরণ

নিচের ইমপ্লিমেন্টেশনটি দেখুন:

#include<bits/stdc++.h> using namespace std; int solve(vector<vector<int>>& mat, int sumTarget) {    int n = mat.size();    int m = n == 0 ? 0 : mat[0].size();    if (m > n) {       vector<vector<int>> transpose(m, vector<int>(n));       for (int i = 0; i < n; i++) {          for (int j = 0; j < m; j++) {             transpose[j][i] = mat[i][j];          }       }       return solve(transpose, sumTarget);    }    int ans = 0;    for (int p = 0; p < m; p++) {       vector<int> arr(n);       for (int q = p; q < m; q++) {          for (int i = 0; i < n; i++) {             arr[i] += mat[i][q];          }          unordered_map<int, int> pcnt = {{0, 1}};          int pref = 0;          for (int i = 0; i < n; i++) {             pref += arr[i];             auto tmp = pcnt.find(pref - sumTarget);             if (tmp != end(pcnt)) ans += tmp->second;             pcnt[pref]++;          }       }    }    return ans; } int main() {    vector<vector<int>> mat = {{0, 0, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}}; cout<< solve(mat, 5) <<endl; return 0; }

ইনপুট

{{0, 0, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}}, 5

আউটপুট

3

  1. C++ প্রোগ্রাম: গ্রিডে আলোকিত কক্ষের সংখ্যা গণনা

  2. C++ প্রোগ্রাম: গ্রাফে ব্রিজ এজের সংখ্যা নির্ণয়

  3. C++ প্রোগ্রাম: গ্রিডে একক পথ তৈরির জন্য ব্লক করতে হলে কক্ষের সংখ্যা

  4. পাইথনে ট্রি থেকে একটি এজ কাট করে দুটি সাবট্রিের নোড ভ্যালু সামের পার্থক্য মিনিমাইজ করা