Cod sursa(job #3302707)

Utilizator TarceaIonutTarcea Tudor Ionut TarceaIonut Data 10 iulie 2025 12:02:50
Problema Jocul Flip Scor 100
Compilator rs Status done
Runda Arhiva de probleme Marime 2.55 kb

struct InputData {
    a: Vec<Vec<i32>>,
    n:usize,
    m:usize
}
fn read_input_data() -> InputData {
    let file_content = std::fs::read_to_string("flip.in").unwrap();
    let file_lines = file_content.split_whitespace().collect::<Vec<&str>>();
    let n = file_lines[0].parse::<usize>().unwrap();
    let m = file_lines[1].parse::<usize>().unwrap();
    let mut a: Vec<Vec<i32>> = vec![vec![0; m]; n];
    {
        let mut number = 2;
        for i in 0..n {
            for j in 0..m {
                a[i][j] = file_lines[number].parse::<i32>().unwrap();
                number += 1;
            }
        }
    }
    let input_data:InputData = InputData { a, n, m, };
    input_data
      
}
// fn get_sum_line(input_data: &InputData, a: &Vec<Vec<i32>> ,line:usize) -> i32{
//     let mut sum = 0;
//     for j in 0..input_data.m {
//         sum += a[line][j];
//     }
//     return sum;
// }
fn get_sum_col(input_data: &InputData, a: &Vec<Vec<i32>>, col:usize) -> i32{
    let mut sum = 0;
    for i in 0..input_data.n {
        sum += a[i][col];
    }
    return sum;
}
fn invert_line(input_data: &InputData, a: &mut Vec<Vec<i32>>, line:usize) {
    for j in 0..input_data.m {
        a[line][j] *= -1;
    }
}
fn invert_col(input_data: &InputData, a: &mut Vec<Vec<i32>>, col:usize) {
    for i in 0..input_data.n {
        a[i][col] *= -1;
    }
}
fn improve_on_col(input_data: &InputData, a: &mut Vec<Vec<i32>>) {
    for j in 0..input_data.m {
        if get_sum_col(input_data, a, j) < 0 {
            invert_col(input_data, a, j);
            //println!("invert colum = {}", j);
        }
    }
}
fn solve(input_data: &InputData) -> i32{
    let pow_16:i32 = 1 << input_data.n;
    let mut rez = 0;
    for i in 0..pow_16 {
        let mut vec = input_data.a.clone();
        //println!("i = {}", i);
        for j in 0..input_data.n {
            if i & (1 << j) == 1 << j {
                invert_line(&input_data, &mut vec, j);
                //println!("invert line = {}", j);
                
            }
        }
        //println!("vec = {:?}", vec);
        improve_on_col(&input_data, &mut vec);
        //println!("vec = {:?}", vec);
        
        let mut val = 0;
        for j in 0..input_data.m {
            val += get_sum_col(&input_data, &vec, j);
        }
        if rez < val {
            rez = val;
        }
    }
    rez
}
fn main() {
    let input_data: InputData = read_input_data();
    //println!("{:#?} \n {} {}", input_data.a, input_data.n, input_data.m);
    let sol = solve(&input_data);
    std::fs::write("flip.out", format!("{}", sol)).unwrap();
}