Cod sursa(job #2325873)

Utilizator rares.amarandeiRares Amarandei rares.amarandei Data 23 ianuarie 2019 00:07:02
Problema Jocul Flip Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <stdlib.h>
#include <stdint.h>
#include <string>
#include <vector>
#include <iostream>
#include <unordered_map>
#include <memory>
#include <algorithm>
#include <deque>
#include <iterator>
#include <numeric>
#include <assert.h>
#include <cstdlib>
#include <sstream>
#include <fstream>

#define INPUT_PATH ""
#define OUTPUT_PATH ""

void algorithm();

int main()
{
  algorithm();
  return 0;
}
using namespace std;

namespace
{
  typedef vector<int>::iterator intIt;

  class RMatrix
  {
  public:
    RMatrix(ifstream& input)
    {
      input >> m_nrRows;
      input >> m_nrCols;
      m_matrix.reserve(m_nrRows*m_nrCols);
      int readVal = 0;
      while (input >> readVal)
      {
        m_matrix.push_back(readVal);
      }
    }

    int getRows() const
    {
      return m_nrRows;
    }

    int getCols() const
    {
      return m_nrCols;
    }

    int operator[](int index) const
    {
      return m_matrix[index];
    }

  private:
    int m_nrCols;
    int m_nrRows;
    vector<int> m_matrix;
  };

  void findMaxSum(
    int step, 
    const RMatrix& matrix, 
    vector<int> colFliped, 
    int& maxSum)
  {
    int sum = 0;
    for (int row = 0; row < matrix.getRows(); ++row)
    {
      int rowSum = 0;
      for (int col = 0; col < matrix.getCols(); ++col)
      {
        int idx = row*matrix.getCols() + col;
        rowSum += colFliped[col] * matrix[idx];
      }
      sum += abs(rowSum);
    }
    maxSum = max(maxSum, sum);

    ++step;
    if (step == matrix.getCols()) return;
    colFliped[step] = 1;
    findMaxSum(step, matrix, colFliped, maxSum);
    colFliped[step] = -1;
    findMaxSum(step, matrix, colFliped, maxSum);
  }

  int findMaxSum(const RMatrix& matrix)
  {
    int maxSum = 0;
    vector<int> colFliped(matrix.getCols(), 1);
    const int step = 0;
    findMaxSum(step, matrix, colFliped, maxSum);
    colFliped[step] = -1;
    findMaxSum(step, matrix, colFliped, maxSum);
    return maxSum;
  }
}

////////////////////////////////////////////////////////////////////////////////
void algorithm()
{
  ifstream inputFile(INPUT_PATH "flip.in");
  ofstream outputFile(OUTPUT_PATH "flip.out");

  RMatrix matrix(inputFile);
  int maxSum = findMaxSum(matrix);

  outputFile << maxSum;
  inputFile.close();
  outputFile.close();
}