Cod sursa(job #526794)

Utilizator monitoiulEmilian Mihalache monitoiul Data 29 ianuarie 2011 14:34:12
Problema Jocul Flip Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<cmath>
#include<fstream>
#include<iostream>

using namespace std;

unsigned g_n,g_m;
int **gp_tabla = NULL;

void citeste_din_fisier(const char nume_fisier[])
{
    ifstream f(nume_fisier);
    if(f.is_open())
    {
        f>>g_n>>g_m;
        int **tabla = new int*[g_n];
        for(unsigned i=0;i<g_n;++i)
            tabla[i] = new int[g_m];
        for(unsigned i=0;i<g_n;++i)
            for(unsigned j=0;j<g_m;++j)
                f>>tabla[i][j];
        gp_tabla = tabla;
    }
    else
    {
        cout<<"fisierul "<<nume_fisier<<" nu a putut fi deschis !"<<endl;
    }
    f.close();
}

long cea_mai_buna_suma_pe_linie(int **tabla, unsigned nr_liniei)
{
    long suma1 = 0;
    long suma2 = 0;

    for(unsigned j=0;j<g_m;++j)
    {
        suma1 += tabla[nr_liniei][j];
        suma2 -= tabla[nr_liniei][j];
    }

    return (suma1>suma2)?suma1:suma2;
}

int **get_flip(unsigned pattern)
{
    int **tabla_cu_flip = new int*[g_n];
    for(unsigned i=0;i<g_n;++i)
        tabla_cu_flip[i] = new int[g_m];

    unsigned coloana_curenta = 0;
    while(coloana_curenta < g_m)
    {
        //0010 = prima coloana neflipped; a doua flipped; a treia neflipped; a patra neflipped
        if(pattern & 0x1)
        {
            for(unsigned i=0;i<g_n;++i)
                tabla_cu_flip[i][coloana_curenta] = -gp_tabla[i][coloana_curenta];
        }
        else
        {
            for(unsigned i=0;i<g_n;++i)
                tabla_cu_flip[i][coloana_curenta] = gp_tabla[i][coloana_curenta];
        }
        pattern >>= 1;
        ++coloana_curenta;
    }
    return tabla_cu_flip;
}

long calculeaza_solutie()
{
    long suma = 0;
    unsigned nr_iteratii = 1;

    for(unsigned i=0;i<g_m;++i)
        nr_iteratii *= 2;

    for(unsigned pattern_curent = 0;pattern_curent < nr_iteratii;++pattern_curent)
    {
        long suma_curenta = 0;
        int** tabla_curenta = get_flip(pattern_curent);

        for(unsigned i=0;i<g_n;++i)
            suma_curenta += cea_mai_buna_suma_pe_linie(tabla_curenta, i);
        if(suma_curenta > suma)
            suma = suma_curenta;

        delete[] tabla_curenta;
    }

    return suma;
}

int main()
{
    citeste_din_fisier("flip.in");
    ofstream g("flip.out");
    g<<calculeaza_solutie();
    g.close();
    return 0;
}