complete 25513.rs
This commit is contained in:
76
storage/zeta/rs/completed/25513.rs
Normal file
76
storage/zeta/rs/completed/25513.rs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
use std::collections::VecDeque;
|
||||||
|
use std::io;
|
||||||
|
|
||||||
|
fn get_from_board(board: &Vec<Vec<i8>>, r: i8, c: i8) -> i8 {
|
||||||
|
board[r as usize][c as usize]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_min_search_cnt(board: &Vec<Vec<i8>>, 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<i8>> = 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::<i8>().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));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user