Cod sursa(job #2771930)

Utilizator Gabryel9898Bizdoc Vasile Gabriel Gabryel9898 Data 30 august 2021 01:03:53
Problema Jocul Flip Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>

const int MAX_SIZE = 20;


int board[MAX_SIZE][MAX_SIZE] = {0};
int M, N;


int sum_column(int number) {
    int sum = 0;
    for (int i = 0; i < M; ++i) {
        sum += board[i][number];
    }
    return sum;
}

int get_sum() {
    int sum = 0;
    for (int i = 0; i < M; ++i) {
        for (int j = 0; j < N; ++j) {
            sum += board[i][j];
        }
    }
    return sum;
}

int flipped_columns[MAX_SIZE] = {0};
int flipped_lines[MAX_SIZE] = {0};

void flip_line(int line_number) {
    for (int i = 0; i < N; ++i) {
        board[line_number][i] *= -1;
    }
}

void flip_line(int line_number, int direction) {
    if (direction == 1) {
        if (flipped_lines[line_number] == 1) {
            return;
        }

        flipped_lines[line_number] = 1;
        flip_line(line_number);
    } else {
        if (flipped_lines[line_number] == 0) {
            return;
        }
        flipped_lines[line_number] = 0;
        flip_line(line_number);
    }
}

void flip_col(int col_nr) {
    for (int i = 0; i < M; ++i) {
        board[i][col_nr] *= -1;
    }
}

void flip_column(int column_number, int direction) {
    if (direction == 1) {
        if (flipped_columns[column_number] == 1) {
            return;
        }

        flipped_columns[column_number] = 1;
        flip_col(column_number);
    } else {
        if (flipped_columns[column_number] == 0) {
            return;
        }

        flipped_columns[column_number] = 0;
        flip_col(column_number);
    }
}


int flip_algo() {
    std::string input_file_name("../flip.in");
    std::string output_file_name("../flip.out");

    std::ifstream input_file;
    input_file.open(input_file_name);

    input_file >> M >> N;

    for (int i = 0; i < M; ++i) {
        for (int j = 0; j < N; ++j) {
            input_file >> board[i][j];
        }
    }

    int limit = 1 << M;
    int max_sum = 0;

    for (int i = 0; i < limit; ++i) {
        for (int j = 0; 1 << j <= i; ++j) {
            if (i & (1 << j)) {
                flip_line(j, 1);
            } else {
                flip_line(j, 0);
            }
        }

        for (int k = 0; k < N; ++k) {
            if (sum_column(k) < 0) {
                flip_column(k, 1);
            }
        }

        int new_sum = get_sum();
        if (new_sum > max_sum) {
            max_sum = new_sum;
        }

        for (int j = 0; j < N; ++j) {
            flip_column(j, 0);
        }
    }

    std::ofstream out;
    out.open(output_file_name);
    out << max_sum;
    return 0;
}

int main() {
    flip_algo();
}