Cod sursa(job #1727141)

Utilizator arenauserIon Ion arenauser Data 9 iulie 2016 22:01:12
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <fstream>
#include <cstring>

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

int getMaxLineSum(unsigned numLines, unsigned numCols, int* matrix, unsigned line, unsigned flippedColsMask)
{
    auto sumLine = 0;
    for (unsigned c = 0; c < numCols; ++c)
    {
        //matrix[line][c] is flipped iff column c is flipped
        auto val = matrix[line * numCols + c];
        auto shouldFlipVal = (flippedColsMask & (1 << c)) != 0;

        sumLine += shouldFlipVal ? -val : val;

    }

    return sumLine >= 0 ? sumLine : -sumLine;
}


int flip(unsigned numLines, unsigned numCols, int* matrix)
{
    unsigned maxColCounter = 1 << numCols;

    int maxSum = 0;

    for (unsigned flippedColsMask = 0; flippedColsMask < maxColCounter; ++flippedColsMask)
    {
        auto currentSum = 0;

        for (unsigned l = 0; l < numLines; ++l)
        {
            currentSum += getMaxLineSum( numLines, numCols, matrix, l, flippedColsMask);
        }

        if (maxSum < currentSum) maxSum = currentSum;
    }

    return maxSum;
}


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

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

    readFile >> numLines >> numCols;

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

    if (numLines <= numCols)
    {
        for (unsigned l = 0; l < numLines; ++l)
        {
            for (unsigned c = 0; c < numCols; ++c)
            {
                readFile >> matrix[c * numLines + l];
            }
        }

        std::swap(numLines, numCols); //now numCols is smaller than numLines
    }
    else
    {
        for (unsigned l = 0; l < numLines; ++l)
        {
            for (unsigned c = 0; c < numCols; ++c)
            {
                readFile >> matrix[l * numCols + c];
            }
        }

    }


    int sum = 0;

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

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

    return 0;
}