Pagini recente » Cod sursa (job #2342297) | Cod sursa (job #2817463) | Cod sursa (job #1183015) | Cod sursa (job #625030) | Cod sursa (job #1727141)
#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;
}