Cod sursa(job #300669)

Utilizator chibicitiberiuChibici Tiberiu chibicitiberiu Data 7 aprilie 2009 16:36:10
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include<fstream>
#include<iostream>
#define sizelimit 18
using namespace std;

int array[sizelimit][sizelimit];
int n, m;

/*********************************
 *      READ FROM FILE           *
 *********************************/
void read()
{
    ifstream in ("flip.in");
    in>>n>>m;
    for (int i=0;i<n;i++)
         for (int j=0;j<m;j++)
              in>>array[i][j];
    in.close();
}

/*********************************
 *     COMUTA                    *
 *********************************/
void comutalinia(int linia)
{
    for (int i=0;i<m;i++)
        array[linia][i]*=-1;
}

void comutacoloana(int coloana)
{
    for (int i=0;i<n;i++)
        array[i][coloana]*=-1;
}

/*********************************
 *     SUMA                      *
 *********************************/

long long suma()
{
    long long temp=0;
    for (int i=0;i<n;i++)
        for (int j=0;j<m;j++)
            temp+=array[i][j];
    return temp;
}


/*********************************
 *     FIND BEST SOLUTIONS       *
 *********************************/
long long findsol()
{
    int negs, poss, s;
    bool comutat;
    long long max;
    do {
        comutat=false;
        for (int i=0;i<n;i++) {
            negs=0; poss=0;
            for (int j=0;j<n;j++) {
                if (array[i][j]<=0) negs++;
                else poss++;
            }
            if (negs>poss) {
                 comutalinia(i);
                 comutat=true;
            }
            else if (negs==poss) {
                max=suma();
                comutalinia(i);
                s=suma();
                if (s>max) comutat=true;
                else comutalinia(i);
                }
        }

        for (int j=0;j<m;j++) {
            negs=0; poss=0; s=0;
            for (int i=0;i<n;i++) {
                if (array[i][j]<=0) negs++;
                else poss++;
                s+=array[i][j];
            }
            if (negs>poss) {
                 comutacoloana(j);
                 comutat=true;
            }
            else if (negs==poss) {
                max=suma();
                comutacoloana(j);
                s=suma();
                if (s>max) comutat=true;
                else comutacoloana(j);
                }
        }


        } while (comutat);


    return suma();
}



/*********************************
 *        MAIN function          *
 *********************************/
int main()
{
    long long temp;
    /// read data from file
    read();

    /// find solutions
    temp=findsol();

    /// output solutions
    ofstream out ("flip.out");
    out<<temp;

    /// cleanup
    out.close();
    return 0;
}