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
59
|
impl Solution {
pub fn count_combinations(pieces: Vec<String>, positions: Vec<Vec<i32>>) -> i32 {
let moves = [
vec![(1,0),(-1,0),(0,1),(0,-1)],
vec![(1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)],
vec![(1,1),(1,-1),(-1,1),(-1,-1)]
];
let n = pieces.len();
let mut dests = vec![vec![]; n];
for i in 0..n {
let mut s = std::collections::HashSet::new();
let (r, c) = (positions[i][0], positions[i][1]);
s.insert((r, c));
let t = if pieces[i] == "rook" { 0 } else if pieces[i] == "queen" { 1 } else { 2 };
for &(dr, dc) in &moves[t] {
for k in 1..8 {
let nr = r + dr*k;
let nc = c + dc*k;
if nr < 1 || nr > 8 || nc < 1 || nc > 8 { break; }
s.insert((nr, nc));
}
}
dests[i] = s.into_iter().collect();
}
let mut ans = 0;
let mut idx = vec![0; n];
fn dfs(d: usize, n: usize, dests: &Vec<Vec<(i32,i32)>>, idx: &mut Vec<usize>, positions: &Vec<Vec<i32>>, ans: &mut i32) {
if d == n {
let mut cur: Vec<(i32,i32)> = positions.iter().map(|p| (p[0],p[1])).collect();
let mut ok = true;
loop {
let mut nxt = cur.clone();
let mut done = true;
for i in 0..n {
if cur[i] != dests[i][idx[i]] {
let dr = dests[i][idx[i]].0 - cur[i].0;
let dc = dests[i][idx[i]].1 - cur[i].1;
if dr != 0 { nxt[i].0 += dr/dr.abs(); }
if dc != 0 { nxt[i].1 += dc/dc.abs(); }
done = false;
}
}
let s: std::collections::HashSet<_> = nxt.iter().collect();
if s.len() < n { ok = false; break; }
if done { break; }
cur = nxt;
}
if ok { *ans += 1; }
return;
}
for i in 0..dests[d].len() {
idx[d] = i;
dfs(d+1, n, dests, idx, positions, ans);
}
}
dfs(0, n, &dests, &mut idx, &positions, &mut ans);
ans
}
}
|