मान लीजिए कि हम एक द्विआधारी आव्यूह है, जिसका आकार m x n है। हमें सभी 1s के साथ वर्ग सबमैट्रिस की संख्या गिननी है। तो अगर मैट्रिक्स की तरह है -
0 | <वें शैली ="पृष्ठभूमि-रंग:आरजीबी (255, 255, 255);">1वें>1 | 1 | |
1 | 1 | 1 | 1 |
0 | 1 | 1 | 1 |
तो 15 वर्ग होंगे। एकल वर्ग के 10 वर्ग, चार वर्ग के 4 वर्ग, और नौ वर्ग वाला 1 वर्ग।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- उत्तर सेट करें:=0, n:=पंक्ति गणना और m:=स्तंभ गणना
- मैं के लिए 0 से मी - 1 की सीमा में
- उत्तर:=उत्तर + मैट्रिक्स[एन -1, आई]
- मैं के लिए 0 से n - 1 की सीमा में
- उत्तर:=उत्तर + मैट्रिक्स[i, m - 1]
- उत्तर:=उत्तर – मैट्रिक्स[n – 1, m-1]
- के लिए मैं श्रेणी n - 2 में 0 से नीचे
- जे के लिए एम -2 से 0 तक नीचे
- यदि मैट्रिक्स[i, j] =1, तो
- matrix[i, j] :=1 + न्यूनतम (मैट्रिक्स[i + 1, j + 1], मैट्रिक्स[i, j + 1], मैट्रिक्स[i + 1, j])
- अन्यथा मैट्रिक्स[i,j] :=0
- उत्तर:=उत्तर + मैट्रिक्स[i, j]
- यदि मैट्रिक्स[i, j] =1, तो
- जे के लिए एम -2 से 0 तक नीचे
- वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: int countSquares(vector<vector<int>>& matrix) { int ans = 0; int n = matrix.size(); int m = matrix[0].size(); for(int i = 0; i < m; i++)ans += matrix[n-1][i]; for(int i = 0; i < n; i++)ans += matrix[i][m-1]; ans -= matrix[n-1][m-1]; for(int i = n - 2;i >= 0; i--){ for(int j = m-2 ;j >= 0; j--){ matrix[i][j] = matrix[i][j] == 1? 1 + min({matrix[i+1][j+1],matrix[i] [j+1],matrix[i+1][j]}) : 0; ans += matrix[i][j]; } } return ans; } }; main(){ vector<vector<int>> v = {{0,1,1,1},{1,1,1,1},{0,1,1,1}}; Solution ob; cout << (ob.countSquares(v)); }
इनपुट
[[0,1,1,1], [1,1,1,1], [0,1,1,1]]
आउटपुट
15