840. Magic Squares In Grid

Violence

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Solution {
public int numMagicSquaresInside(int[][] grid) {
int m = grid.length, n = grid[0].length;

int count = 0;

// 枚举左上角的点
for (int i = 0; i < m - 2; i++) {
for (int j = 0; j < n - 2; j++) {
if (isMagicSquares(grid, i, j)) {
count++;
}
}
}

return count;
}

private boolean isMagicSquares(int[][] grid, int i, int j) {
int totalSum = 0;
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
totalSum += grid[k][l];
}
}
if (totalSum % 3 != 0) {
return false;
}
int targetSum = totalSum / 3;

int colSum0 = 0, colSum1 = 0, colSum2 = 0;
for (int k = i; k < i + 3; k++) {
colSum0 += grid[k][j];
colSum1 += grid[k][j + 1];
colSum2 += grid[k][j + 2];
}
if (!(colSum0 == targetSum && colSum1 == targetSum && colSum2 == targetSum)) {
return false;
}
int rowSum0 = 0, rowSum1 = 0, rowSum2 = 0;
for (int k = j; k < j + 3; k++) {
rowSum0 += grid[i][k];
rowSum1 += grid[i + 1][k];
rowSum2 += grid[i + 2][k];
}
if (!(rowSum0 == targetSum && rowSum1 == targetSum && rowSum2 == targetSum)) {
return false;
}

int lineSum0 = grid[i][j] + grid[i + 1][j + 1] + grid[i + 2][j + 2];
int lineSum1 = grid[i][j + 2] + grid[i + 1][j + 1] + grid[i + 2][j];
if (!(lineSum0 == targetSum && lineSum1 == targetSum)) {
return false;
}

return true;
}
}

References

840. Magic Squares In Grid