Cod sursa(job #2771921)

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

int board[16][16] = {0};

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

void flip_column(int column_number) {
    for (auto &i: board) {
        i[column_number] *= -1;
    }
}

int sum_column(int number) {
    int sum = 0;
    for (auto &i: board) {
        sum += i[number];
    }
    return sum;
}

int get_sum() {
    int sum = 0;
    for (const auto &row: board) {
        for (const auto &col: row) {
            sum += col;
        }
    }
    return sum;
}

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

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);

    int M, N;
    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)) {
                if (flipped_lines[j] == 0) {
                    flip_line(j);
                    flipped_lines[j] = 1;
                }
            } else {
                if (flipped_lines[j] == 1) {
                    flip_line(j);
                    flipped_lines[j] = 0;
                }
            }
        }

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

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

        for (int j = 0; j < N; ++j) {
            if (flipped_columns[j] == 1) {
                flipped_columns[j] = 0;
                flip_column(j);
            }
        }
    }


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

int main() {
    flip_algo();
}