Files
CodeTest/baekjoon/체스판_다시_칠하기/solution_20269120.rs
2024-08-29 16:22:10 +09:00

62 lines
1.6 KiB
Rust

macro_rules! parse_line {
($($t: ty),+) => ({
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
let mut iter = line.split_whitespace();
($(iter.next().unwrap().parse::<$t>().unwrap()),+)
})
}
macro_rules! parse_chess {
() => ({
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
let list: Vec<u8> = line.chars().map(|w| match w {'B' => 1, _ => 0}).collect();
list
})
}
fn main(){
let (n, m) = parse_line!(usize, usize);
let mut chess : Vec<Vec<u8>> = Vec::new();
for _i in 0..n{
let chess_line = parse_chess!();
chess.push(chess_line);
}
let mut min_change = 64;
for i in 0..=n-8{
for j in 0..=m-8{
let x = minimum_change(&chess, i, j).unwrap();
if x < min_change{
min_change = x;
}
}
}
println!("{}", min_change);
}
fn minimum_change(chess : &Vec<Vec<u8>>, x0 : usize, y0 : usize) -> Option<usize>{
let n = chess.len();
let m = if n > 0{ chess[0].len() } else{ 0 };
if x0 + 8 > n || y0 + 8 > m{
return None;
}
let mut min_change : [usize; 2] = [0, 0]; // [start with white; start with blue]
for (idx, row) in chess[x0..x0+8].iter().enumerate(){
for (idx2, &value) in row[y0..y0+8].iter().enumerate(){
let remain : usize = (idx + idx2) % 2;
min_change[remain] += value as usize;
min_change[1 - remain] += 1 - value as usize;
}
}
if min_change[0] > min_change[1]{
return Some(min_change[1]);
}
return Some(min_change[0]);
}