diff --git a/storage/zeta/rs/completed/25513.rs b/storage/zeta/rs/completed/25513.rs new file mode 100644 index 0000000..14f3d20 --- /dev/null +++ b/storage/zeta/rs/completed/25513.rs @@ -0,0 +1,76 @@ +use std::collections::VecDeque; +use std::io; + +fn get_from_board(board: &Vec>, r: i8, c: i8) -> i8 { + board[r as usize][c as usize] +} + +fn get_min_search_cnt(board: &Vec>, pos: (i8, i8)) -> isize { + let mut deq: VecDeque<((i8, i8), isize, i8)> = VecDeque::new(); + + let init_state = if get_from_board(&board, pos.0, pos.1) == 1 { + 1 + } else { + 0 + }; + + let mut gvis = vec![vec![false; 6]; 25]; + deq.push_back((pos, 0, init_state)); + + while deq.is_empty() == false { + let (now, cnt, state) = deq.pop_front().unwrap(); + + gvis[(now.0 * 5 + now.1) as usize][state as usize] = true; + + for (i, j) in [(0, 1), (0, -1), (1, 0), (-1, 0)].iter() { + let (r, c) = (now.0 + i, now.1 + j); + if r < 0 || r >= 5 || c < 0 || c >= 5 { + continue; + } + let ahead = get_from_board(&board, r, c); + if ahead == -1 { + continue; + } else if gvis[(r * 5 + c) as usize][state as usize] == true { + continue; + } + + if ahead - state == 1 { + if ahead == 6 { + return cnt + 1; + } else { + deq.push_back(((r, c), cnt + 1, state + 1)); + } + continue; + } else { + deq.push_back(((r, c), cnt + 1, state)); + } + } + } + + return -1; +} + +fn main() { + let mut board: Vec> = Vec::new(); + let mut line = String::new(); + + for _ in 0..5 { + io::stdin().read_line(&mut line).unwrap(); + + board.push( + line.split_ascii_whitespace() + .map(|token| token.parse::().unwrap()) + .collect(), + ); + line.clear(); + } + io::stdin().read_line(&mut line).unwrap(); + let mut iter = line.split_ascii_whitespace(); + + let pos: (i8, i8) = ( + iter.next().unwrap().parse().unwrap(), + iter.next().unwrap().parse().unwrap(), + ); + + println!("{}", get_min_search_cnt(&board, pos)); +}