কম্পিউটার

C++ এ নন-জিরো সাবমেট্রিসের সংখ্যা খুঁজে বের করার জন্য প্রোগ্রাম


ধরুন আমাদেরকে একটি ম্যাট্রিক্স দেওয়া হয়েছে যাতে মাত্র দুটি মান রয়েছে; 1s এবং 0s. আমাদের প্রদত্ত ম্যাট্রিক্সের সাবমেট্রিক্সের সংখ্যা খুঁজে বের করতে হবে যাতে সমস্ত 1s রয়েছে। আমরা আউটপুট হিসাবে মান প্রিন্ট করি।

সুতরাং, যদি ইনপুট মত হয়

0 0 1 0
0 1 0 0
0 1 0 1
1 1 0 1

তাহলে আউটপুট হবে 12।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • n :=ম্যাট্রিক্সের আকার
  • m :=ম্যাট্রিক্সের আকার[0]
  • আকারের একটি অ্যারে যোগ সংজ্ঞায়িত করুন:n+1 x m+1।
  • আরম্ভ করার জন্য i :=0, যখন i করুন
  • আরম্ভ করার জন্য j :=0, যখন j করুন
  • যোগ করুন[i + 1, j + 1] + =ম্যাট্রিক্স[i, j]
  • add[i + 1, j + 1] + =add[i, j + 1]
  • add[i + 1, j + 1] + =add[i + 1, j]
  • add[i + 1, j + 1] - =add[i, j]
  • res :=0
  • আরম্ভ করার জন্য i :=0, যখন i করুন
  • আরম্ভ করার জন্য j :=0, যখন j করুন
  • যদি ম্যাট্রিক্স[i, j] অ-শূন্য হয়, তাহলে −
    • নিম্নলিখিত অংশ উপেক্ষা করুন, পরবর্তী পুনরাবৃত্তিতে যান
  • আরম্ভ করার জন্য k :=1, যখন k <=(n - i), আপডেট করুন (k 1 দ্বারা বাড়ান), −
      করুন
    • p :=0,
    • q :=m - j;
    • যখন p <=q, do −
      • x :=(p + q) / 2
      • a :=k * x
      • cur :=add[i + k, j + x] - add[i, j + x] - add[i + k, j] + add[i, j]
      • যদি cur এর সাথে a হয়, তাহলে −
        • r :=x
        • p :=x + 1
      • অন্যথায়,
        • q :=x - 1
    • যদি r 0 এর সমান হয়, তাহলে −
      • লুপ থেকে বেরিয়ে আসুন
    • res :=res + r
  • রিটার্ন রিটার্ন
  • উদাহরণ

    আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    #include<bits/stdc++.h>
    using namespace std;
    
    int solve(vector<vector<int>>& matrix) {
       int n = matrix.size();
       int m = matrix[0].size();
       int add[n + 1][m + 1];
       memset(add, 0, sizeof(add));
    
       for (int i = 0; i < n; i++) {
          for (int j = 0; j < m; j++) {
             add[i + 1][j + 1] += matrix[i][j];
             add[i + 1][j + 1] += add[i][j + 1];
             add[i + 1][j + 1] += add[i + 1][j];
             add[i + 1][j + 1] -= add[i][j];
          }
       }
       int res = 0;
       for (int i = 0; i < n; i++) {
          for (int j = 0; j < m; j++) {
             if (!matrix[i][j])
                continue;
             for (int k = 1; k <= (n - i); k++) {
                int p = 0,
                   q = m - j;
                int r;
                while (p <= q) {
                   int x = (p + q) / 2;
                   int a = k * x;
                   int cur = add[i + k][j + x] - add[i][j + x] - add[i + k][j] + add[i][j];
                   if (cur == a) {
                      r = x;
                      p = x + 1;
                   } else
                      q = x - 1;
                }
                if (r == 0)
                   break;
                res += r;
                }
          }
       }
       return res;
    }
    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) <<endl;
    return 0;
    }

    ইনপুট

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

    আউটপুট

    12

    1. একটি গ্রিডে আলোকিত কোষের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম

    2. একটি প্রদত্ত গ্রাফে সেতুর প্রান্তের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম

    3. একটি প্রদত্ত শর্ত পূরণ করে এমন একটি অ্যারের জোড়ার সংখ্যা খুঁজে বের করতে C++ প্রোগ্রাম

    4. একটি পাথ তৈরি করতে একটি গ্রিডে ব্লক করার জন্য সেলের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম