Cod sursa(job #514030)

Utilizator tvararuVararu Theodor tvararu Data 17 decembrie 2010 16:41:11
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <string>
using namespace std;
int g_nMatrix[16][16];
int g_nVerticalSize = 1, g_nHorizontalSize = 1;
string Line = "Line", Column = "Column";

void Flip (const int &rnIndex, string strWhat)
{
    for (int iii = 0; iii < ((strWhat == "Line") ? g_nVerticalSize : g_nHorizontalSize); iii++)
        ((strWhat == "Line") ? g_nMatrix[iii][rnIndex] : g_nMatrix[rnIndex][iii]) *= -1;
}

int CalculateSum ()
{
    int nSum = 0;
    for (int iii = 0; iii < g_nVerticalSize; iii++)
        for (int jjj = 0; jjj < g_nHorizontalSize; jjj++)
            nSum += g_nMatrix[iii][jjj];
    return nSum;
}

void Backtrack (int nVertIndex, int nHorizIndex)
{
    if  (nHorizIndex == g_nHorizontalSize)
    {
        ofstream out ("flip.out");
        out << CalculateSum ();
        out.close();
    }
    else if  (nVertIndex == g_nVerticalSize)
    {
        int nSum = CalculateSum ();
        Flip (nHorizIndex, Line);
        int nSumAfterFlip = CalculateSum ();
        if (nSumAfterFlip > nSum)
            Backtrack (nVertIndex, nHorizIndex + 1);
        else
        {
            Flip (nHorizIndex, Line);
            Backtrack (nVertIndex, nHorizIndex + 1);
        }
    }
    else
    {
        int nSum = CalculateSum ();
        Flip (nVertIndex, Column);
        int nSumAfterFlip = CalculateSum ();
        if (nSumAfterFlip > nSum)
            Backtrack (nVertIndex + 1, nHorizIndex);
        else
        {
            Flip (nVertIndex, Column);
            Backtrack (nVertIndex + 1, nHorizIndex);
        }
    }
}

int main ()
{
    ifstream in ("flip.in");
    in >> g_nVerticalSize >> g_nHorizontalSize;
    for (int iii = 0; iii < g_nVerticalSize; iii++)
        for (int jjj = 0; jjj < g_nHorizontalSize; jjj++)
            in >> g_nMatrix[iii][jjj];
    in.close();
    Backtrack (0, 0);

    return 0;
}