# 【LeetCode】 1277. Count Square Submatrices with All Ones
## Description
> Given a `m * n` matrix of ones and zeros, return how many square submatrices have all ones.
> Constraints:
> * `1 <= arr.length <= 300`
> * `1 <= arr[0].length <= 300`
> * `0 <= arr[i][j] <= 1`
> 給予一個`m * n`且只有零和一的陣列,回傳裡面有多少用一組成的正方形。
> 限制:
> * `1 <= arr.length <= 300`
> * `1 <= arr[0].length <= 300`
> * `0 <= arr[i][j] <= 1`
## Example:
```
Example 1:
Input: matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
Output: 15
Explanation:
There are 10 squares of side 1.
There are 4 squares of side 2.
There is 1 square of side 3.
Total number of squares = 10 + 4 + 1 = 15.
Example 2:
Input: matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
Output: 7
Explanation:
There are 6 squares of side 1.
There is 1 square of side 2.
Total number of squares = 6 + 1 = 7.
```
## Solution
* 解題靈感來自[這題](https://hackmd.io/@Zero871015/LeetCode-221)。
* 上面那題是要求最大的正方形多大,其解法是用小的正方形慢慢堆成大的。因為大的正方形都包含了小的正方形的資訊,我們就可以直接透過總和得到答案。
### Code
```C++=1
class Solution {
public:
int countSquares(vector<vector<int>>& matrix) {
if(matrix.empty())
return 0;
int sum = 0;
for(int i = 0; i < matrix.size(); i++)
{
for(int j = 0; j < matrix[0].size(); j++)
{
if(i != 0 && j != 0 && matrix[i][j] == 1)
matrix[i][j] = min(min(matrix[i - 1][j], matrix[i][j - 1]), matrix[i - 1][j - 1]) + matrix[i][j];
sum += matrix[i][j];
}
}
return sum;
}
};
```
###### tags: `LeetCode` `C++`