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
60
61
62
63
64
|
use std::collections::HashSet;
pub fn earliest_and_latest(n: i32, first_player: i32, second_player: i32) -> Vec<i32> {
fn get_key(players: &Vec<u8>, f: usize, s: usize) -> String {
let mut d1 = 0; let mut d2 = 0; let mut d3 = 0;
for (i, &v) in players.iter().enumerate() {
if i < f.min(s) && v == b'1' { d1 += 1; }
else if i > f.min(s) && i < f.max(s) && v == b'1' { d2 += 1; }
else if i > f.max(s) && v == b'1' { d3 += 1; }
}
format!("{}|{}|{}", d1, d2, d3)
}
fn help(players: &mut Vec<u8>, l: usize, r: usize, round: i32, n: usize, f: usize, s: usize, minr: &mut i32, maxr: &mut i32, visited: &mut HashSet<String>) {
if l >= r {
help(players, 0, n-1, round+1, n, f, s, minr, maxr, visited);
return;
}
if players[l] == b'0' {
help(players, l+1, r, round, n, f, s, minr, maxr, visited);
return;
}
if players[r] == b'0' {
help(players, l, r-1, round, n, f, s, minr, maxr, visited);
return;
}
if (l == f && r == s) || (l == s && r == f) {
*minr = (*minr).min(round);
*maxr = (*maxr).max(round);
return;
}
if l == f || l == s {
let tmp = players[r];
players[r] = b'0';
help(players, l+1, r-1, round, n, f, s, minr, maxr, visited);
players[r] = tmp;
return;
}
if r == f || r == s {
let tmp = players[l];
players[l] = b'0';
help(players, l+1, r-1, round, n, f, s, minr, maxr, visited);
players[l] = tmp;
return;
}
let key = get_key(players, f, s);
if visited.contains(&key) { return; }
visited.insert(key);
let tmp = players[r];
players[r] = b'0';
help(players, l+1, r-1, round, n, f, s, minr, maxr, visited);
players[r] = tmp;
let tmp = players[l];
players[l] = b'0';
help(players, l+1, r-1, round, n, f, s, minr, maxr, visited);
players[l] = tmp;
}
let mut minr = i32::MAX;
let mut maxr = i32::MIN;
let mut players = vec![b'1'; n as usize];
let mut visited = HashSet::new();
let f = (first_player - 1) as usize;
let s = (second_player - 1) as usize;
help(&mut players, 0, n as usize - 1, 1, n as usize, f, s, &mut minr, &mut maxr, &mut visited);
vec![minr, maxr]
}
|