|
| 1 | +pub struct Solution {} |
| 2 | +impl Solution { |
| 3 | + pub fn num_islands(grid: Vec<Vec<char>>) -> i32 { |
| 4 | + use std::collections::HashSet; |
| 5 | + use std::collections::VecDeque; |
| 6 | + if grid.is_empty() { |
| 7 | + return 0; |
| 8 | + } |
| 9 | + let mut set: HashSet<(i32, i32)> = HashSet::new(); |
| 10 | + let mut res = 0; |
| 11 | + fn bfs(set: &mut HashSet<(i32, i32)>, row: i32, col: i32, grid: &Vec<Vec<char>>) { |
| 12 | + let mut queue = VecDeque::new(); |
| 13 | + set.insert((row, col)); |
| 14 | + queue.push_back((row, col)); |
| 15 | + while !queue.is_empty() { |
| 16 | + let (row, col) = queue.pop_front().unwrap(); |
| 17 | + let directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]; |
| 18 | + for dir in directions { |
| 19 | + let (r, c) = (row + dir.0, col + dir.1); |
| 20 | + if r > 0 |
| 21 | + && r < grid.len() as i32 |
| 22 | + && c > 0 |
| 23 | + && c < grid.len() as i32 |
| 24 | + && !set.contains(&(r, c)) |
| 25 | + && grid[r as usize][c as usize] != '0' |
| 26 | + { |
| 27 | + queue.push_back((row + dir.0, col + dir.1)); |
| 28 | + set.insert((row + dir.0, col + dir.1)); |
| 29 | + } |
| 30 | + } |
| 31 | + } |
| 32 | + } |
| 33 | + for i in 0..grid.len() { |
| 34 | + for j in 0..grid[0].len() { |
| 35 | + if grid[i][j] == '1' && !set.contains(&(i as i32, j as i32)) { |
| 36 | + bfs(&mut set, i as i32, j as i32, &grid); |
| 37 | + res += 1; |
| 38 | + } |
| 39 | + } |
| 40 | + } |
| 41 | + res |
| 42 | + } |
| 43 | +} |
| 44 | + |
0 commit comments