pub fn num_magic_squares_inside(grid: Vec<Vec<i32>>) -> i32 {
let (_r, _c) = (grid.len(), grid.first().unwrap().len());
if _r < 3 || _c < 3 {
return 0;
}
fn magic(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32, g: i32, h: i32, i: i32) -> bool {
let mut x = [a, b, c, d, e, f, g, h, i];
x.sort();
if !x.eq(&[1, 2, 3, 4, 5, 6, 7, 8, 9]) {
return false;
}
[
a + b + c, d + e + f, g + h + i,
a + d + g, b + e + h, c + f + i,
a + e + i, c + e + g,
]
.iter()
.all(|&x| x == 15)
}
let mut ans = 0;
for r in 0.._r - 2 {
for c in 0.._c - 2 {
if grid[r + 1][c + 1] != 5 {
continue;
}
if magic(
grid[r][c], grid[r][c + 1], grid[r][c + 2],
grid[r + 1][c], grid[r + 1][c + 1], grid[r + 1][c + 2],
grid[r + 2][c], grid[r + 2][c + 1], grid[r + 2][c + 2],
) {
ans += 1;
}
}
}
ans
}