Cod sursa(job #2195297)

Utilizator asunaAsuna Yuuki asuna Data 15 aprilie 2018 22:07:20
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readFile(int &m, int &n, int ** &matrix) {
    ifstream in;
    in.open("flip.in");

    if (in.fail()) {
        cerr << "Cannot open this file.";
        exit(1);
    }

    in >> m;
    in >> n;

    matrix = new int *[m];
    for (int i = 0; i < m; ++i)
        matrix[i] = new int[n];

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            in >> matrix[i][j];
        }
    }

    in.close();
}

int getSum(int m, int n, int ** matrix) {
    int sum = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

int getColumnSum(int n, int column, int ** matrix) {
    int sum = 0;
    for(int i = 0; i < n; i++)
        sum += matrix[i][column];
    return  sum;
}

int getFlipColumnSum(int n, int column, int ** matrix) {
    int sum = 0;
    for(int i = 0; i < n; i++)
        sum += -matrix[i][column];
    return  sum;
}

void flipColumn(int n, int column, int ** matrix) {
    for(int i = 0; i < n; i++)
        matrix[i][column] = -matrix[i][column];
}

int getRowSum(int n, int row, int ** matrix) {
    int sum = 0;
    for(int i = 0; i < n; i++)
        sum += matrix[row][i];
    return  sum;
}

int getFlipRowSum(int n, int row, int ** matrix) {
    int sum = 0;
    for(int i = 0; i < n; i++)
        sum += -matrix[row][i];
    return  sum;
}

void flipRow(int n, int row, int ** matrix) {
    for(int i = 0; i < n; i++)
        matrix[row][i] = -matrix[row][i];
}

int getResult(int &m, int &n, int ** &matrix) {
    int currentSum = 0;
    int maximumSum = 0;

    do {
        if(currentSum > maximumSum)
            maximumSum = currentSum;

        for (int i = 0; i < n; i++) {
            int sum = getColumnSum(m, i, matrix);
            int flipSum = getFlipColumnSum(m, i, matrix);

            if (sum < flipSum)
                flipColumn(m, i, matrix);
        }

        for (int i = 0; i < m; i++) {
            int sum = getRowSum(n, i, matrix);
            int flipSum = getFlipRowSum(n, i, matrix);

            if (sum < flipSum)
                flipRow(n, i, matrix);
        }

        currentSum = getSum(m, n, matrix);

    }while(currentSum != maximumSum);

    return maximumSum;
}

void writeFile(int answer) {
    ofstream out;
    out.open("flip.out");

    if(out.is_open()) {
        out << answer;
    } else {
        cerr << "Failed to create file.";
        exit(2);
    }
}

int main() {

    int m, n;
    int **matrix;

    readFile(m, n, matrix);
    getResult(m, n, matrix);

    writeFile(getResult(m, n, matrix));

    return 0;
}