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
|
use std::collections::VecDeque;
impl Solution {
pub fn shortest_bridge(a: Vec<Vec<i32>>) -> i32 {
let m = a.len(); let n = a[0].len();
let mut vis = vec![vec![false;n];m];
let dirs = [(1,0),(-1,0),(0,1),(0,-1)];
let mut q = VecDeque::new();
let mut found = false;
fn dfs(a: &Vec<Vec<i32>>, vis: &mut Vec<Vec<bool>>, q: &mut VecDeque<(usize,usize)>, i: isize, j: isize, m: usize, n: usize, dirs: &[(isize,isize)]) {
if i<0||j<0||i>=m as isize||j>=n as isize||vis[i as usize][j as usize]||a[i as usize][j as usize]==0 { return; }
vis[i as usize][j as usize]=true; q.push_back((i as usize,j as usize));
for &(dx,dy) in dirs { dfs(a, vis, q, i+dx, j+dy, m, n, dirs); }
}
'outer: for i in 0..m {
for j in 0..n {
if a[i][j]==1 { dfs(&a, &mut vis, &mut q, i as isize, j as isize, m, n, &dirs); found=true; break 'outer }
}
}
let mut step = 0;
while !q.is_empty() {
for _ in 0..q.len() {
let (x,y) = q.pop_front().unwrap();
for &(dx,dy) in &dirs {
let ni = x as isize + dx; let nj = y as isize + dy;
if ni>=0&&nj>=0&&ni<m as isize&&nj<n as isize&&!vis[ni as usize][nj as usize] {
if a[ni as usize][nj as usize]==1 { return step; }
q.push_back((ni as usize, nj as usize)); vis[ni as usize][nj as usize]=true;
}
}
}
step += 1;
}
-1
}
}
|