-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflip_chess.rs
75 lines (70 loc) · 3.09 KB
/
flip_chess.rs
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
65
66
67
68
69
70
71
72
73
74
75
// 黑白翻转棋
// https://leetcode.cn/problems/fHi6rV
// INLINE ../../images/search/fHi6rV.jpeg
use std::{cmp::max, collections::VecDeque};
pub struct Solution;
impl Solution {
pub fn flip_chess(chessboard: Vec<String>) -> i32 {
let m = chessboard.len();
let n = chessboard[0].len();
let dx: [isize; 8] = [1, -1, 0, 0, 1, 1, -1, -1];
let dy: [isize; 8] = [0, 0, 1, -1, 1, -1, 1, -1];
let mut res = 0;
let mut cnt;
for i in 0..m {
for j in 0..n {
if chessboard[i].chars().nth(j).unwrap() == '.' {
let mut g = chessboard.clone(); // Copy the initial chessboard
g[i].remove(j);
g[i].insert(j, 'X');
cnt = 0;
let mut q: VecDeque<(usize, usize)> = VecDeque::new();
q.push_back((i, j));
while let Some((x, y)) = q.pop_front() {
for k in 0..8 {
let mut find = 0;
let mut nx = (x as isize) + dx[k];
let mut ny = (y as isize) + dy[k];
while nx >= 0
&& (nx as usize) < m
&& ny >= 0
&& (ny as usize) < n
&& g[nx as usize].chars().nth(ny as usize).unwrap() != '.'
{
if g[nx as usize].chars().nth(ny as usize).unwrap() == 'X' {
find = 1;
break;
}
nx += dx[k];
ny += dy[k];
}
if find == 1 {
let mut nx = (x as isize) + dx[k];
let mut ny = (y as isize) + dy[k];
while nx >= 0
&& (nx as usize) < m
&& ny >= 0
&& (ny as usize) < n
&& g[nx as usize].chars().nth(ny as usize).unwrap() != '.'
{
if g[nx as usize].chars().nth(ny as usize).unwrap() != 'X' {
g[nx as usize].remove(ny as usize);
g[nx as usize].insert(ny as usize, 'X');
cnt += 1;
q.push_back((nx as usize, ny as usize));
} else {
break;
}
nx += dx[k];
ny += dy[k];
}
}
}
}
res = max(res, cnt);
}
}
}
res
}
}