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
|
use std::collections::HashMap;
struct NeighborSum {
grid: Vec<Vec<i32>>,
pos: HashMap<i32, (usize, usize)>,
n: usize,
}
impl NeighborSum {
fn new(grid: Vec<Vec<i32>>) -> Self {
let n = grid.len();
let mut pos = HashMap::new();
for i in 0..n {
for j in 0..n {
pos.insert(grid[i][j], (i, j));
}
}
Self { grid, pos, n }
}
fn adjacent_sum(&self, v: i32) -> i32 {
let (i, j) = self.pos[&v];
let mut ans = 0;
for (di, dj) in [(-1,0),(1,0),(0,-1),(0,1)] {
let ni = i as isize + di;
let nj = j as isize + dj;
if ni >= 0 && ni < self.n as isize && nj >= 0 && nj < self.n as isize {
ans += self.grid[ni as usize][nj as usize];
}
}
ans
}
fn diagonal_sum(&self, v: i32) -> i32 {
let (i, j) = self.pos[&v];
let mut ans = 0;
for (di, dj) in [(-1,-1),(-1,1),(1,-1),(1,1)] {
let ni = i as isize + di;
let nj = j as isize + dj;
if ni >= 0 && ni < self.n as isize && nj >= 0 && nj < self.n as isize {
ans += self.grid[ni as usize][nj as usize];
}
}
ans
}
}
|