Cod sursa(job #1726972)

Utilizator oanaagoana a oanaag Data 9 iulie 2016 16:53:49
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <cstring>

const char* inFile = "flip.in";
const char* outFile = "flip.out";


void flipLine(int numLines, int numCols, int* matrix, int lineNum)
{
    for (int index = 0; index < numCols; ++index)
    {
        matrix[lineNum * numCols + index] *= -1;
    }
}

void flipCol(int numLines, int numCols, int* matrix, int colNum)
{

    for (int index = 0; index < numLines; ++index)
    {
        matrix[index * numCols + colNum] *= -1;
    }
}

int sum(int numLines, int numCols, int* matrix)
{
    int sum = 0;

    for (auto i = 0; i < numLines * numCols; ++i)
    {
        sum += matrix[i];
    }

    return sum;
}

int flip(int numLines, int numCols, int* matrix)
{
    int maxFlip = 1 << (numLines + numCols - 1);

    int* copyMatrix = new int[numLines * numCols];

    int maxSum = 0;

    for (int i = 0; i < maxFlip; ++i)
    {
        std::memcpy(copyMatrix, matrix, sizeof(int) * numLines * numCols);

        for (int l = 0; l < numLines; ++l)
        {
            if ((i & (1 << l)) != 0) flipLine(numLines, numCols, copyMatrix, l);
        }

        for (int c = 0; c < numCols - 1; ++c)
        {
            if ((i & (1 << (numLines + c))) != 0) flipCol(numLines, numCols, copyMatrix, c);
        }

        auto currentSum = sum(numLines, numCols, copyMatrix);
        if (maxSum < currentSum) maxSum = currentSum;
    }

    return maxSum;
}


int main()
{
    int numLines = 0;
    int numCols = 0;

    std::ifstream readFile(inFile);
    if (!readFile) return -1;

    readFile >> numLines >> numCols;

    int* matrix = new int[numLines*numCols];


    for (int index = 0; index < numLines * numCols; ++index)
    {
        readFile >> matrix[index];
    }

    int sum = 0;

    if (numLines > 0 && numCols > 0)
    {
        sum = flip(numLines, numCols, matrix);
    }

    {
        std::ofstream writeFile(outFile);
        writeFile << sum;
    }

    return 0;
}