Cod sursa(job #78962)

Utilizator Dr.OptixCristian Dinu Dr.Optix Data 20 august 2007 11:27:52
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.49 kb
/*******************************************************************************
Problema   : Jocul Flip
Website    : InfoArena
Rezolvitor : Dr.Optix

Enunt:
Gigel a descoperit un nou joc pe care l-a numit "Flip". Acesta se joaca pe o 
tabla dreptunghiulara de dimensiuni N*M care contine numere intregi. Fiecare 
linie si fiecare coloana are un comutator care schimba starea tuturor 
elementelor de pe acea linie sau coloana, inmultindu-le cu -1. Scopul jocului 
este ca pentru o configuratie data a tablei de joc sa se actioneze asupra 
liniilor si coloanelor astfel incat sa se obtina o tabla cu suma elementelor cat
mai mare.

Cerinta
Dandu-se o configuratie pentru tabla "Flip", realizati un program care sa 
determine suma maxima pe care Gigel o poate obtine.

Date de Intrare
Prima linie a fisierului flip.in contine doua numere intregi N si M, separate 
prin cate un spatiu, care reprezinta dimensiunea tablei. Urmatoarele N linii
contin cate M numere intregi seperate prin cate un spatiu care descriu
configuratia tablei de joc.

Date de Iesire
Prima linie a fisierului flip.out contine un numar care va reprezenta suma
maxima pe care Gigel o poate obtine comutand liniile si coloanele tablei de joc.

Restrictii si precizari
    * 1 <= N, M <= 16
    * Tabla de joc contine numere intregi din intervalul [-1.000.000,1.000.000]
*******************************************************************************/

//includ fisierele necesare
#include <fstream.h>

//main() -- functia principala
int main()
{
    //deschid fisierele
    ifstream fin("flip.in"); ofstream fout("flip.out");
    
    //declar variabilele necesare
    long long mat1[16][16],mat2[16][16],n,m,s1,s2,sa,sb;
    int i,j;
    
    //citesc datele
    fin>>n>>m;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            fin>>mat1[i][j];
            mat2[i][j]=mat1[i][j];
        }
    
    //fac ce mi se cere
    for(j=0;j<m;j++)
    {
        s1=s2=0;
        for(i=0;i<n;i++)
        {
            s1+=mat1[i][j]; s2+=-mat1[i][j];
        }
        if(s1<=s2)
            for(i=0;i<n;i++)
                mat1[i][j]=-mat1[i][j];
    }
    for(i=0;i<n;i++)
    {
        s1=s2=0;
        for(j=0;j<m;j++)
        {
            s1+=mat1[i][j]; s2+=-mat1[i][j];
        }
        if(s1<=s2)
            for(j=0;j<m;j++)
                mat1[i][j]=-mat1[i][j];
    }
    //========================
    for(i=0;i<n;i++)
    {
        s1=s2=0;
        for(j=0;j<m;j++)
        {
            s1+=mat2[i][j]; s2+=-mat2[i][j];
        }
        if(s1<=s2)
            for(j=0;j<m;j++)
                mat2[i][j]=-mat2[i][j];
    }
    for(j=0;j<m;j++)
    {
        s1=s2=0;
        for(i=0;i<n;i++)
        {
            s1+=mat2[i][j]; s2+=-mat2[i][j];
        }
        if(s1<=s2)
            for(i=0;i<n;i++)
                mat2[i][j]=-mat2[i][j];
    }
    
    /*/test scriu matricea obtinuta
    fout<<n<<" "<<m<<"\n";
    for(i=0;i<n;i++)
    {   for(j=0;j<m;j++)
            fout<<mat1[i][j]<<" ";
        fout<<"\n";
    }
    fout<<"\n";
    for(i=0;i<n;i++)
    {   for(j=0;j<m;j++)
            fout<<mat2[i][j]<<" ";
        fout<<"\n";
    }*/
    
    //scriu rezultatul
    s1=s2=0;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            s1+=mat1[i][j]; s2+=mat2[i][j];
        }

    if(s1>s2)
        fout<<s1;
    else
        fout<<s2;
               
    //inchid fisierele
    fin.close(); fout.close();
    return 0;
}