Module c
Expand description
ยงABC 383 C - Humidifier 3
refs: https://atcoder.jp/contests/abc383/tasks/abc383_c
use std::collections::VecDeque;
use proconio::{input, marker::Chars};
const DIRECTIONS: [(isize, isize); 4] = [(-1, 0), (0, -1), (1, 0), (0, 1)];
fn main() {
input! {
h: usize, w: usize, d: usize,
mut field: [Chars; h],
}
let mut queue = VecDeque::new();
for (x, row) in field.iter().enumerate() {
for (y, &cell) in row.iter().enumerate() {
if cell == 'H' {
queue.push_back((x, y, 0));
}
}
}
while let Some((x, y, dist)) = queue.pop_front() {
if dist > d || field[x][y] == '#' {
continue;
}
field[x][y] = 'W';
if dist == d {
continue;
}
for (dx, dy) in DIRECTIONS {
if outbound(x, y, dx, dy, h, w) {
continue;
}
let cx = (x as isize + dx) as usize;
let cy = (y as isize + dy) as usize;
if field[cx][cy] == '.' || field[cx][cy] == 'H' {
queue.push_back((cx, cy, dist + 1));
}
}
}
let ans = field.into_iter().flatten().filter(|&c| c == 'W').count();
println!("{ans}");
}
fn outbound(x: usize, y: usize, dx: isize, dy: isize, h: usize, w: usize) -> bool {
let cx = x as isize + dx;
let cy = y as isize + dy;
cx < 0 || cx >= h as isize || cy < 0 || cy >= w as isize
}