62 lines
1.6 KiB
Rust
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]);
|
|
}
|